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
:它在找到第一个匹配记录后立即返回.
这是一个查询,它只返回在两列user_one
和user_two
of中都没有找到对应关系的行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_one
和user_two
)有一个关节,查询仅返回没有匹配关节的行。
希望这会帮助你。