MySQL使用反联接在两个表之间选择非重复值

时间:2018-08-31 04:01:27

标签: mysql join

我试图根据表B中的值从表A中选择值。但是,我不知道该使用什么。

目标:

  • 我网站上的用户从网页上的表A中获得了整个复选框列表。
  • 然后用户选择一个复选框,该复选框中的值为 插入表B。
  • 在某个时间点,用户返回该网页,仅看到未插入表B的复选框。

就数据库而言,我将使用一个选择查询,该查询将表A(包含所有值)和表B(基本上存储表A中的值的副本)进行比较。

这是我的查询。 wp_ml_skill_class 是表A, wp_ml_character_skill 是表B

SELECT DISTINCT
s.skill_name, s.skill_id, c.char_id, c.um_id, c.class_id
FROM
`wp_ml_skill_class` sc
JOIN
`wp_ml_skill` s 
ON 
(s.skill_id = sc.skill_id)
JOIN 
`wp_ml_character` c
WHERE 
c.class_id = 3 
AND 
c.char_id = 5
AND
sc.skill_id 
NOT IN 
(SELECT cs.skill_id FROM wp_ml_character_skill cs);

1 个答案:

答案 0 :(得分:2)

您可以在表A和表B之间使用LEFT JOIN进行此操作,检查表B的NULL结果,该结果将代表表A中的行,而不是表B中的行。

SELECT A.*
FROM wp_ml_skill_class A
LEFT JOIN wp_ml_character_skill B
ON B.skill_id = A.skill_id
WHERE B.skill_id IS NULL

这是一个演示的小例子:

create table A (id int, val varchar(10));
create table B (id int, val varchar(10));

insert into A values (1, 'a'), (2, 'b'), (3, 'c');
insert into B values (2, 'b');

SELECT *
FROM  A
LEFT JOIN  B
ON B.id = A.id
WHERE B.id IS NULL

输出:

id  val     id      val
1   a       (null)  (null)
3   c       (null)  (null)