我有以下两个表:
Table: user_has_academy_team
Columns:
user_id int(11) PK
academy_team_id int(11) PK
timestamp datetime
Table: user_has_academy_module
Columns:
id int(11) AI PK
user_id int(11)
module_id int(11)
academy_team_id int(11)
academy_id int(11)
sort_number int(11)
is_complete int(11)
score_to_pass int(11)
is_open int(11)
deadline datetime
module_version_id int(11)
waiting_approval int(11)
我希望找到表user_has_academy_module
中academy_team_id
和user_id
在user_has_academy_team
答案 0 :(得分:1)
SELECT a.* FROM user_has_academy_team a
LEFT JOIN user_has_academy_module b
ON a.user_id = b.user_id AND a.academy_team_id = academy_team_id
WHERE b.user_id IS NULL or b.academy_team_id IS NULL
应该给你结果(我相信,因为你没有发布样本和预期)。但是我觉得你的桌子结构还有很多不足之处。如果你的用户user_has_academy_team表上有一个auto_increment主键而不是复合主键,并且在你的另一个表中引用了,那么生活就会轻松得多。
答案 1 :(得分:1)
试试这个:
SELECT m.* FROM user_has_academy_module AS m
LEFT JOIN user_has_academy_team as t
ON m.user_id = t.user_id
AND m.academy_team_id = t.academy_team_id
WHERE t.user_id IS NULL
它是如何工作的:你试图在一个或多个字段上加入2个表,当第二个表的字段为NULL时,你知道表格在这些字段上不匹配。
答案 2 :(得分:1)
您正在寻找NOT IN
(或NOT EXISTS
)子句:一个表中的记录与另一个表中的记录不匹配:
select *
from user_has_academy_module
where (user_id, academy_team_id) not in
(select user_id, academy_team_id from user_has_academy_team);
在对另一个答案的评论中,您说要删除user_has_academy_module中的那些记录,这些记录与同一查询相同,只能使用delete
而不是select
:
delete
from user_has_academy_module
where (user_id, academy_team_id) not in
(select user_id, academy_team_id from user_has_academy_team);