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 不使用索引
为啥这个语句 rs=st.executeQuery(query);是否在执行?如何仅选择一个表,这取决于两个表中来自 mysql 的输入 type=radio?