我正在尝试检索具有多种便利设施的属性。
但是表结构是:属性在property
表中,设施与属性相关联。
设施表有:
id property_id amenity_name ....
现在我想搜索有“停车”和“电梯”等设施。
select property_id from amenities where name = 'parking' and name = 'elevator';
我不想为此发起连接查询。
在这种情况下,有人可以救我吗?
答案 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?
}