MYSQL从两个表中选择,但第二个表并不总是与第一个表有关系

时间:2012-10-12 15:28:09

标签: mysql join

所以我有两个表,一个包含用户信息(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 个答案:

答案 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');