所以我有两个表,一个包含用户信息(Users
),另一个包含哪些用户不显示的信息(Settings
)。所以,我想做一个查询,它将显示users
表中除settings
中列出的用户之外的所有用户。提前谢谢。
用户
| id | name |
===============
| 1 | adam |
| 2 | alex |
| 3 | andrew|
设置
| id | name | value | user_id |
===============================
| 1 | hide | 1 | 1 |
我希望结果为:
| id | name |
==============
| 1 | alex |
| 2 | andrew|
答案 0 :(得分:2)
要获取一个表中存在的内容列表,而不是另一个(相关)表中的内容列表,您可以使用着名的LEFT JOIN-NULL组合:
SELECT u.id, u.name
FROM users AS u
LEFT JOIN settings AS s
ON s.user_id = u.id
WHERE s.user_id IS NULL
关于从属子查询的...或NOT IN子句:
SELECT u.id, u.name
FROM users AS u
WHERE u.id NOT IN (SELECT user_id FROM settings)
我通常使用第一个,但根据this article,它们之间不应存在任何明显的速度差异。无论如何,我建议在特定的数据库实例上对它们进行基准测试,然后选择最佳实例。
答案 1 :(得分:2)
类似的东西:
SELECT * FROM users WHERE id NOT IN (SELECT user_id FROM settings WHERE name="hide");
只会获得来自users表的用户,这些用户不在设置名称等于“hide”的设置表中
答案 2 :(得分:0)
SELECT * FROM users WHERE id NOT IN (SELECT * FROM settings)
答案 3 :(得分:0)
试试这个
SELECT * FROM users WHERE id NOT IN (SELECT user_id FROM settings WHERE user_id='1');