MySQL选择左连接为空的行

Mic*_*uel 25 mysql sql join left-join

我有这些MySQL表:

表格1:

id | writer
1  | Bob   
2  | Marley
3  | Michael
Run Code Online (Sandbox Code Playgroud)

表2:

user_one | user_two
   1     | 2
Run Code Online (Sandbox Code Playgroud)

而这个查询:

SELECT table1.id FROM table1 LEFT JOIN table2 ON table1.id = table2.user_one
Run Code Online (Sandbox Code Playgroud)

此查询将返回table1的所有行,即1,2,3

我想只选择左关节中找不到的行.所以它应该只返回带有id的行3

我希望与INNER JOIN相反,它只选择在连接中找到的行.如果左边的连接存在,如何得到反面,忽略它并移动到下一行.希望我很清楚

Gar*_*thD 44

您可以使用以下查询:

SELECT  table1.id 
FROM    table1 
        LEFT JOIN table2 
            ON table1.id IN (table2.user_one, table2.user_two)
WHERE   table2.user_one IS NULL;
Run Code Online (Sandbox Code Playgroud)

虽然,根据您的索引,table2您可能会发现两个联接表现更好:

SELECT  table1.id 
FROM    table1 
        LEFT JOIN table2 AS t1
            ON table1.id = t1.user_one
        LEFT JOIN table2 AS t2
            ON table1.id = t2.user_two
WHERE   t1.user_one IS NULL
AND     t2.user_two IS NULL;
Run Code Online (Sandbox Code Playgroud)


Pre*_*red 14

如果您不想返回任何列,最好的方法之一table2是使用NOT EXISTS

SELECT  table1.id 
FROM    table1 T1
WHERE
  NOT EXISTS (SELECT *
              FROM table2 T2
              WHERE T1.id = T2.user_one
                  OR T1.id = T2.user_two)
Run Code Online (Sandbox Code Playgroud)

在语义上,这表示您要查询的内容:选择第二个表中没有匹配记录的每一行.

MySQL针对以下内容进行了优化EXISTS:它在找到第一个匹配记录后立即返回.


Joë*_*min 5

这是一个查询,它只返回在两列user_oneuser_twoof中都没有找到对应关系的行table2

SELECT T1.*
FROM table1 T1
LEFT OUTER JOIN table2 T2A ON T2A.user_one = T1.id
LEFT OUTER JOIN table2 T2B ON T2B.user_two = T1.id
WHERE T2A.user_one IS NULL
    AND T2B.user_two IS NULL
Run Code Online (Sandbox Code Playgroud)

每列 (user_oneuser_two)有一个关节,查询仅返回没有匹配关节的行。

希望这会帮助你。