gpt4 book ai didi

sql - 选择与多对多连接表中的所有组匹配的记录

转载 作者:行者123 更新时间:2023-11-29 15:08:30 25 4
gpt4 key购买 nike

我有 2 个表:集合和组。两者都使用第三个表 set_has_groups 连接。我想要获得包含我指定的所有组的集合

一种方法是

SELECT column1, column2 FROM sets WHERE 
id IN(SELECT set_id FROM set_has_group WHERE group_id = 1)
AND id IN(SELECT set_id FROM set_has_group WHERE group_id = 2)
AND id IN(SELECT set_id FROM set_has_group WHERE group_id = 3)

显然这不是最漂亮的解决方案

我也尝试过这个:

SELECT column1, column2 FROM sets WHERE 
id IN(SELECT set_id FROM set_has_group WHERE group_id IN(1,2,3) GROUP BY group_id
HAVING COUNT(*) = 3

这看起来更漂亮,但问题是它需要很长时间才能执行。第一个查询运行时间约为 200 毫秒,而第二个查询则需要 1 分钟多。

知道这是为什么吗?

===更新:我已经玩过更多了,我修改了第二个查询,如下所示

SELECT columns FROM `set` WHERE id IN(
select set_id FROM
(
SELECT set_id FROM set_has_group
WHERE group_id IN(1,2,3)
GROUP BY set_id HAVING COUNT(*) = 3
) as temp
)

速度真快它与之前的第二个查询相同,只是我将其包装在另一个临时表中很奇怪

最佳答案

我怀疑第二个查询中存在小错误。

说实话,我也不确定。可能第二个查询是通过全表扫描执行的。同时第一个“IN”真正转变为“EXISTS”。所以,你可以尝试使用“存在”。例如:

...
where 3 = (select count(*) from set_has_group
where group_id in (1, 2, 3) and set_id = id
group by set_id)

关于sql - 选择与多对多连接表中的所有组匹配的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1440832/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com