4

我正在尝试从几张表中获取多个属性(例如卧室、浴室等),是的,我当前的查询似乎只能获得一个属性。我错过了什么?

我最终想要找到的是带有 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')

但是我必须怎么做才能获得更多属性的结果(例如 WHERE a.name like 'bathrooms' AND av.value like '2')?如果我在主 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

这使得使用self-join

4

1 回答 1

3

您的架构中有很多间接性。为什么需要这张property_attribute桌子有什么特别的地方吗?您是否希望多个属性共享一个属性值?

无论如何,这是给您的查询。非常符合我上面提到的两个可能的 副本的精神。

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 回答