MySQL Query Join 从两个表中选择不匹配的行

Posted

技术标签:

【中文标题】MySQL Query Join 从两个表中选择不匹配的行【英文标题】:MySQL Query Join to select unmatched rows from two tables 【发布时间】:2012-12-25 20:43:49 【问题描述】:

我有两张如下表。


user_id   |   username        |  first_name |   role_type
-----------------------------------------------------------
1         |   testuser1       |  testu1     |    student
2         |   testuser2       |  testu2     |    student
3         |   testuser3       |  testu3     |    student
4         |   testuser4       |  testu4     |    student
5         |   testuser5       |  testu5     |    student
6         |   testuser6       |  testu6     |    admin
7         |   testuser7       |  testu7     |    admin
-----------------------------------------------------------

user_id   |   username         |    approved_id
----------------------------------------------------------------------
1         |   testuser1        |  3B888F52-50BC-11E2-B08B-99E5B2CADDF7
2         |   testuser2        |  3B888F52-50BC-11E2-B08B-99E5B2CADDF7
3         |   testuser3        |  3B888F52-50BC-11E2-B08B-99E5B2CADDF7
----------------------------------------------------------------------

我试过查询

SELECT users.* FROM users 
WHERE users.username NOT IN(
     SELECT users_approval.username FROM users_approval 
     WHERE users_approval.approved_id = "3B888F52-50BC-11E2-B08B-99E5B2CADDF7"
) AND users.role_type = "student"

得到下面的结果


user_id   |   username        |  first_name |   role_type
-------------------------------------------------------------
4         |   testuser4       |  testu4     |    student
5         |   testuser5       |  testu5     |    student
-------------------------------------------------------------

有没有办法使用 JOIN 来获取与上面相同的结果集?

非常感谢您的帮助。

【问题讨论】:

【参考方案1】:
SELECT users.* 
FROM   users 
       LEFT JOIN users_approval b
          ON users.username = b.username AND
             b.approved_id = "3B888F52-50BC-11E2-B08B-99E5B2CADDF7"
WHERE  users.role_type = "student" AND
       b.approved_id IS NULL
SQLFiddle Demo

【讨论】:

太棒了..!我得到了一些关于连接现在如何工作的想法:P。非常感谢KJ【参考方案2】:
SELECT 
    users.* 
FROM users as u
LEFT JOIN users_approval as ua ON  ua.id = u.id
WHERE u.role_type = "student" AND ua.approved_id IS NULL

假设你在第二个表中有 user_id 作为外键,它可以用来加入而不是使用用户名加入表

【讨论】:

以上是关于MySQL Query Join 从两个表中选择不匹配的行的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Mysql JOIN Query - Full SCAN 不使用索引

MySQL INNER JOIN 从其他表中只选择一行

MYSQL QUERY:为每个相册从表中选择 1 行照片

为啥这个语句 rs=st.executeQuery(query);是否在执行?如何仅选择一个表,这取决于两个表中来自 mysql 的输入 type=radio?

MySQL Join语句将数据从两个表中获取到datagridview中

mysql 里面JOIN 和 INNER JOIN 区别是啥