查询“计数”中的高级条件

时间:2015-02-26 01:38:28

标签: mysql sql hibernate

很多城市,每个城市都有一堆房子(1个或更多),每个房子都有固定的属性集。每个属性都有:characteristic_id(可以是颜色,形状或车库类型),value_id(红色,绿色蓝色,COLORS表,金字塔,矩形等,用于SHAPES等)。

我希望所有包含至少一座蓝屋和至少一座金字塔屋的城市(也可能是同一所房子)

我希望能够使用Hibernate来完成这个

但是将所有表格加在一起我无法提出可以选择此项的标准。例如,如果我为color指定characteristic_id = 1,为blue指定value_id = 2,为shape指定characteristic_id = 2,为金字塔指定value_id = 3,则显然会返回0行,因为没有这样的行有两个不同的值for characteristic_id。

实际上,我需要选择所有至少有一个属性的城市,例如characteristic_id = 1和value_id = 2 AND至少一个属性,使得characteristic_id = 2和value_id = 3(不必来自同一所房子)。换句话说,从计数的城市中选择*(具有characteristic_id = 1且value_id = 2属于城市c的属性)> 0 AND count(属性为city_id = 2且value_id = 3属于city c的属性)> 0

有些东西告诉我也许group_by,count或者可以解决这个问题,但我已经尝试过这些无济于事。

1 个答案:

答案 0 :(得分:1)

您需要将所有表连接在一起。然后,您可以使用group byhaving子句解决问题:

select c.cityid
from cities c join
     houses h
     on c.cityid = h.cityid join
     attributes a
     on h.attributeid = a.attributeid
group by c.cityid
having sum(case when characteristic_id = 1 and value_id = 2 then 1 else 0 end) > 0 and      
       sum(case when characteristic_id = 2 and value_id = 3 then 1 else 0 end) > 0;