多次在同一列上的mysql AND子句

时间:2011-07-23 13:08:48

标签: mysql

我正在尝试检索具有多种便利设施的属性。

但是表结构是:属性在property表中,设施与属性相关联。

设施表有:

id property_id amenity_name ....

现在我想搜索有“停车”和“电梯”等设施。

select property_id from amenities where name = 'parking' and name = 'elevator';

我不想为此发起连接查询。

在这种情况下,有人可以救我吗?

3 个答案:

答案 0 :(得分:6)

试试这个:

SELECT property_id FROM amenities
WHERE amenity_name IN ('parking', 'elevator')
GROUP BY property_id 
HAVING COUNT(amenity_name) >= 2

这是发生了什么...

首先,获取您感兴趣的设施的物业ID列表:

SELECT property_id FROM amenities WHERE amenity_name IN ('parking', 'elevator')

然后缩小列表以仅包含具有多个舒适性的属性ID。按property_id分组将结果捆绑到基于其所属property_id的唯一组中。然后,我们只计算每组中的amenity_names的数量,并检查它是否为2或更大。

GROUP BY property_id HAVING COUNT(amenity_name) >= 2

上面代码中的一个假设是,您不会多次使用与property_id相关联的amenity_name。要消除与此相关的问题,请更改HAVING子句以包含DISTINCT以清除重复项,但除非您需要,否则请不要添加它。

GROUP BY property_id HAVING COUNT(DISTINCT(amenity_name)) >= 2

答案 1 :(得分:4)

select property_id 
from amenities 
where name in ('parking','elevator')
group by property_id
having count(distinct(name)) = 2

答案 2 :(得分:1)

试试这个 - :

   scope :amenity_type, lambda {|term|
          where("amenities.name" => term).joins(:amenities).group("amenities.property_id").having("count(amenities.name) >= #{term.size}") unless term.blank?
   }