我正在尝试检索具有多种便利设施的房产.
但表结构是:属性在property表中,设施与属性相关联.
设施表有:
id property_id amenity_name ....
Run Code Online (Sandbox Code Playgroud)
现在我想搜索有"停车"和"电梯"等设施.
select property_id from amenities where name = 'parking' and name = 'elevator';
Run Code Online (Sandbox Code Playgroud)
我不想为此启动连接查询.
在这种情况下,有人可以救我吗?
试试这个:
SELECT property_id FROM amenities
WHERE amenity_name IN ('parking', 'elevator')
GROUP BY property_id
HAVING COUNT(amenity_name) >= 2
Run Code Online (Sandbox Code Playgroud)
这是发生了什么......
首先,获取您感兴趣的设施的房产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
select property_id
from amenities
where name in ('parking','elevator')
group by property_id
having count(distinct(name)) = 2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5202 次 |
| 最近记录: |