0

所以我有两张表,一张包含用户信息(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| 
4

4 回答 4

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)

我通常使用第一个,但根据这篇文章,它们之间不应该有任何显着的速度差异。无论如何,我建议在您的特定数据库实例上对它们进行基准测试,然后选择最好的一个。

于 2012-10-12T15:30:54.077 回答
2

就像是:

SELECT * FROM users WHERE id NOT IN (SELECT user_id FROM settings WHERE name="hide");

只会从用户表中获取不在设置名称等于“隐藏”的设置表中的用户

于 2012-10-12T15:31:46.243 回答
0

SELECT * FROM users WHERE id NOT IN (SELECT * FROM settings)

于 2012-10-12T15:30:47.877 回答
0

试试这个

SELECT * FROM users WHERE id NOT IN (SELECT user_id FROM settings WHERE user_id='1');

于 2012-10-12T16:37:24.903 回答