簡體   English   中英

MySQL選擇左連接為空的行

[英]MySQL select rows where left join is null

我有這些 MySQL 表:

表格1:

id | writer
1  | Bob   
2  | Marley
3  | Michael

表2:

user_one | user_two
   1     | 2

這個查詢:

SELECT table1.id FROM table1 LEFT JOIN table2 ON table1.id = table2.user_one

此查詢將返回 table1 的所有行,即 1、2、3

我只想選擇在左關節中找不到的行。 所以它應該只返回 id 為3的行

我想要與 INNER JOIN 相反,它將只選擇在連接中找到的行。 如果左連接存在,如何獲得相反的結果,忽略它並移至下一行。 希望我清楚

您可以使用以下查詢:

SELECT  table1.id 
FROM    table1 
        LEFT JOIN table2 
            ON table1.id IN (table2.user_one, table2.user_two)
WHERE   table2.user_one IS NULL;

雖然,根據您在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;

如果您不想從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)

從語義上講,這說明了您要查詢的內容:選擇第二個表中沒有匹配記錄的每一行。

MySQL 針對EXISTS進行了優化:一旦找到第一個匹配記錄,它就會返回。

對此還有一個注意事項:當您檢查連接表中的可為空列時,根據您的需要,您可能必須使用NOT EXISTS (或在使用LEFT JOIN時檢查其他列),因為 MySQL 將無法區分為NULL的列,但連接表中存在現有記錄,以及由於連接表沒有匹配記錄而生成為NULL的列。

這是一個查詢,它只返回在table2user_oneuser_two列中沒有找到對應的行:

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

每列有一個關節( user_oneuser_two ),查詢只返回沒有匹配關節的行。

希望這會幫助你。

SELECT table1.id 
FROM table1 
LEFT JOIN table2 ON table1.id = table2.user_one
WHERE table2.user_one is NULL

嘗試以下查詢: -

 SELECT table1.id 
 FROM table1 
 where table1.id 
 NOT IN (SELECT user_one
         FROM Table2
             UNION
         SELECT user_two
         FROM Table2)

希望這對您有所幫助。

嘗試:

SELECT A.id FROM
(
  SELECT table1.id FROM table1 
  LEFT JOIN table2 ON table1.id = table2.user_one
  WHERE table2.user_one IS NULL
) A
JOIN (
  SELECT table1.id FROM table1 
  LEFT JOIN table2 ON table1.id = table2.user_two
  WHERE table2.user_two IS NULL
) B
ON A.id = B.id

演示

或者您可以使用兩個帶有別名的LEFT JOINS ,例如:

SELECT table1.id FROM table1 
 LEFT JOIN table2 A ON table1.id = A.user_one
 LEFT JOIN table2 B ON table1.id = B.user_two
 WHERE A.user_one IS NULL
 AND B.user_two IS NULL

第二個演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM