4

いくつかのテーブルから複数の属性(寝室、バスルームなど)を取得しようとしています。はい、現在のクエリでは1つの属性しか取得できないようです。私は何が欠けていますか?

私が最終的に見つけようとしているのは、2つのバスルームと2つのベッドルームを備えたproperty_idです。この場合、希望する結果はプロパティIDの1と4です。

これがsqlfiddleの私の例です

表の例:

property
--------
id 
1
2
3
4

attribute
---------
id name
1  bedrooms
2  bathrooms

attribute_value
---------------------
id attribute_id value
1  1            1
2  1            2
3  1            3
4  2            1
5  2            2
6  2            3

property_attributes
------------------------------
property_id attribute_value_id
1           2
1           5
2           2
2           4
3           1
3           4
4           2
4           5 

このクエリは、単一の属性に基づくクエリのみを表示したい場合に、必要な結果を生成できます。

SELECT p.property_id
FROM property p
INNER JOIN property_attribute pa ON p.property_id = pa.property_id
INNER JOIN property_area pc ON p.property_id = pc.property_id
WHERE pa.attribute_value_id
IN (
SELECT av.attribute_value_id
FROM attribute_value av
INNER JOIN attribute a ON av.attribute_id = a.attribute_id
WHERE a.name like 'bedrooms' AND av.value like '2')

しかし、より多くの属性(たとえば、「bathrooms」のようなa.nameと「2」のようなav.value)で結果を得るには、何をする必要がありますか?main where句に別のサブクエリを追加すると、結果が返されません。

///編集///

他の誰かがそのような状況に陥った場合に私のために働いた解決策はここにあります:

SELECT p.property_id
FROM property p
INNER JOIN property_attribute pa ON p.property_id = pa.property_id
INNER JOIN property_attribute pa2 ON p.property_id = pa2.property_id
INNER JOIN property_attribute pa3 ON p.property_id = pa3.property_id
WHERE pa.attribute_value_id = 2 
AND pa2.attribute_value_id = 5
AND pa3.attribute_value_id = 7

これにより、自己結合が使用されます。

4

1 に答える 1

3

スキーマには非常に多くの間接性があります。property_attributeテーブルが必要な特定のポイントはありますか? 単一の属性値が多くのプロパティで共有されることを期待していますか?

いずれにせよ、ここにあなたのためのクエリがあります。私が上で述べた2つの可能な 重複の精神に非常に似ています。

SELECT property.property_id,
       bedrooms.value AS bedrooms,
       bathrooms.value AS bathrooms
FROM property,
     attribute AS bedrooms_attr,
     attribute_value AS bedrooms,
     property_attribute AS bedrooms_prop,
     attribute AS bathrooms_attr,
     attribute_value AS bathrooms,
     property_attribute AS bathrooms_prop
WHERE bedrooms_attr.name = 'bedrooms'
  AND bedrooms.attribute_id = bedrooms_attr.attribute_id
  AND bedrooms.attribute_value_id = bedrooms_prop.attribute_value_id
  AND bedrooms_prop.property_id = property.property_id
  AND bedrooms.value = 2
  AND bathrooms_attr.name = 'bathrooms'
  AND bathrooms.attribute_id = bathrooms_attr.attribute_id
  AND bathrooms.attribute_value_id = bathrooms_prop.attribute_value_id
  AND bathrooms_prop.property_id = property.property_id
  AND bathrooms.value = 2

で遊ぶデータのフィドルを提供してくれてありがとう。

于 2012-08-01T07:47:45.613 に答える