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

标签 sql subquery exists

我有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/

相关文章:

sql - 如何使用 VIEW 将 Postgresql ltree 结构转换为嵌套集?

mysql - CASE WHEN 与多个 THEN ELSE

Mysql 内连接问题

Laravel 检查属性存在

SQLite 删除的数据保留在数据库二进制文件中

php - 更改 PHP/SQL 查询时出现的问题

mysql - 在存储过程中检索多行

mysql - SQL Inner Join with/子查询返回与/criteria的差异

sql - Oracle SQL - 在 where 空间中什么比 3 "and exists()"更快?

sql - sql SELECT NULL 和 SELECT 1 的性能比较