gpt4 book ai didi

使用 EXISTS 和 OR 运算符的 SQL 查询

转载 作者:行者123 更新时间:2023-12-02 07:30:40 26 4
gpt4 key购买 nike

我有4张 table

    users
| id |Username|
| 1 | John |
| 2 | Mike |
| 3 | Alex |

user_contacts
| user_id |contact_id|
| 1 | 2 |
| 1 | 3 |
| 2 | 3 |

contact_groups
| id | Group name |
| 1 | Group 1 |
| 2 | Group 2 |
| 3 | Group 3 |

user_contact_groups
| user_id |contact_group_id|
| 1 | 1 |
| 1 | 2 |
| 3 | 2 |

id 喜欢做的是拉取属于联系人组 1 和 3 的用户或用户 1 的联系人(在表:user_contacts 中)。下面是代码,但它返回查询为空

SELECT DISTINCT a.* from  users as a 
WHERE EXISTS (SELECT * FROM user_contacts as b
WHERE b.user_id = 1) OR
(a.id IN (select c.user_id
FROM user_contact_groups as c
WHERE c.contact_group_id IN (1,3)));

最佳答案

这就是我的做法,并且应该是最佳的:

SELECT DISTINCT u.*
FROM users u
LEFT OUTER JOIN user_contacts c ON u.id = c.contact_id
AND c.user_id = 1
LEFT OUTER JOIN user_contact_groups g ON u.user_id = g.user_id
AND g.contact_group_id IN (1,3)
WHERE c.id IS NOT NULL OR g.id IS NOT NULL

如果你想使用EXISTS,你当然可以扭转这一点,但查询可能无法使用索引(你可以删除此查询的DISTICT):

SELECT *
FROM users u
WHERE EXISTS
(
SELECT 1
FROM user_contacts c
WHERE c.contact_id = u.id
AND c.user_id = 1
)
OR EXISTS
(
SELECT 1
FROM user_contact_groups g
WHERE g.user_id = u.user_id
AND g.contact_group_id IN (1,3)
)

我建议进行 EXPLAIN,看看哪一个更适合您的 RDBMS。

关于使用 EXISTS 和 OR 运算符的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13964414/

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