これらの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の反対の並べ替えが必要です。左結合が存在する場合のように反対を取得し、それを無視して次の行に移動する方法。私は明確だと思います
次のクエリを使用できます。
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;
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
向けに最適化されています:最初に一致するレコードが見つかるとすぐに戻ります。
両方の列に一致が見つからなかった行のみを返すクエリ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
)クエリは、一致するジョイントを持たない行のみを返します。
これがお役に立てば幸いです。
試してください:
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
次のクエリを試してください:-
SELECT table1.id
FROM table1
where table1.id
NOT IN (SELECT user_one
FROM Table2
UNION
SELECT user_two
FROM Table2)
これがお役に立てば幸いです。
SELECT table1.id
FROM table1
LEFT JOIN table2 ON table1.id = table2.user_one
WHERE table2.user_one is NULL