SQL查找两个表不匹配的位置(组合键)

时间:2017-01-19 09:52:57

标签: mysql sql

我有以下两个表:

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_moduleacademy_team_iduser_iduser_has_academy_team

中不匹配的所有记录

3 个答案:

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