web-dev-qa-db-ja.com

MySQLは、左結合が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

このクエリは、1,2,3であるtable1のすべての行を返します。

左のジョイントにない行のみを選択したい。したがって、ID 3の行のみを返す必要があります

結合で見つかった行のみを選択するINNER JOINの反対の並べ替えが必要です。左結合が存在する場合のように反対を取得し、それを無視して次の行に移動する方法。私は明確だと思います

24
Michael Samuel

次のクエリを使用できます。

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 2つの結合のパフォーマンスが向上する場合があります。

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;
41
GarethD

table2から列を返さない場合の最良の方法の1つは、 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)

意味的に、これはクエリの対象を示しています。2番目のテーブルに一致するレコードがないすべての行を選択します。

MySQLはEXISTS向けに最適化されています:最初に一致するレコードが見つかるとすぐに戻ります。

13
Pred

両方の列に一致が見つからなかった行のみを返すクエリ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

各列に1つのジョイントがあります(user_oneおよびuser_two)クエリは、一致するジョイントを持たない行のみを返します。

これがお役に立てば幸いです。

3
Joël Salamin

試してください:

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

見る Demo

または、次のようなエイリアスを持つ2つの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

見る 2nd Demo

2
Edper

次のクエリを試してください:-

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

これがお役に立てば幸いです。

1
Ankit Bajpai
SELECT table1.id 
FROM table1 
LEFT JOIN table2 ON table1.id = table2.user_one
WHERE table2.user_one is NULL
1
Chris