首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >子查询中的MySQL交

子查询中的MySQL交
EN

Stack Overflow用户
提问于 2010-09-21 21:35:15
回答 2查看 1.8K关注 0票数 1

我试图为(公寓)列表创建一个过滤器,通过apartment features表与apartsments_features建立多到多的关系。

我只想包括一些功能的 all (在表单上标记为“是”)的公寓,不包括所有具有任何另一套功能的公寓(标记为“No”)。我意识到我不能在INTERSECTMINUS中使用MySQL太晚了。

我有一个类似这样的查询:

代码语言:javascript
复制
SELECT `apartments`.* FROM `apartments` WHERE `apartments`.`id` IN (
    SELECT `apartments`.`id` FROM `apartments` INTERSECT (
        SELECT `apartment_id` FROM `apartments_features` WHERE `feature_id` = 103 
INTERSECT SELECT `apartment_id` FROM `apartments_features` WHERE `feature_id` = 106
    ) MINUS (
    SELECT `apartment_id` FROM `apartments_features` WHERE `feature_id` = 105 UNION 
    SELECT `apartment_id` FROM `apartments_features` WHERE `feature_id` = 107)
)
ORDER BY `apartments`.`name` ASC

我很确定有办法做到这一点,但目前我的知识仅限于简单的左、右连接。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-09-22 13:24:21

一种稍微不同的方法:

代码语言:javascript
复制
select a.*
from apartments a
join apartments_features f1 
on a.apartment_id = f1.apartment_id and f1.feature_id in (103,106) -- applicable features
where not exists
(select null from apartments_features f2
 where a.apartment_id = f2.apartment_id and f2.feature_id in (105,107) ) -- excluded features
group by f1.apartment_id
having count(*) = 2 -- number of applicable features
票数 2
EN

Stack Overflow用户

发布于 2010-09-21 21:42:04

你可以试试这样的方法:

代码语言:javascript
复制
SELECT apartment_id
FROM
(
    SELECT apartment_id
    FROM apartments_features
    WHERE feature_id IN (103, 106)
    GROUP BY apartment_id
    HAVING COUNT(*) = 2
) T1
LEFT JOIN
(
    SELECT apartment_id
    FROM apartments_features
    WHERE feature_id IN (105, 107)
) T2
ON T1.apartment_id = T2.apartment_id
WHERE T2.apartment_id IS NULL

将此查询的结果加入到“公寓”表中,以获取名称等。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3764683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档