it-swarm.com.de

MySQL-Auswahlzeilen, bei denen der linke Join null ist

Ich habe diese MySQL-Tabellen:

tabelle 1:

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

tabelle 2:

user_one | user_two
   1     | 2

Und diese Abfrage:

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

Diese Abfrage gibt alle Zeilen von table1 zurück, die 1,2,3 sind

Ich möchte nur Zeilen auswählen, die sich nicht im linken Gelenk befinden. Es sollte also nur eine Zeile mit der ID 3

Ich möchte das Gegenteil von INNER JOIN, bei dem nur die Zeilen ausgewählt werden, die im Join gefunden werden. Wenn das Gegenteil der Fall ist, ignorieren Sie es und wechseln Sie in die nächste Zeile. Hoffe, ich bin klar

24
Michael Samuel

Sie könnten die folgende Abfrage verwenden:

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

Obwohl, abhängig von Ihren Indizes auf table2 Sie können feststellen, dass zwei Verknüpfungen eine bessere Leistung erzielen:

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

Eine der besten Vorgehensweisen, wenn Sie keine Spalten von table2 Zurückgeben möchten, ist die Verwendung von 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)

Semantisch sagt dies, was Sie abfragen möchten: Wählen Sie jede Zeile aus, in der in der zweiten Tabelle kein übereinstimmender Datensatz vorhanden ist.

MySQL ist optimiert für EXISTS: Es wird zurückgegeben, sobald der erste übereinstimmende Datensatz gefunden wurde.

13
Pred

Hier ist eine Abfrage, die nur die Zeilen zurückgibt, in denen in beiden Spalten keine Entsprechung gefunden wurde. user_one und user_two von 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

Es gibt eine Verbindung für jede Spalte (user_one und user_two) und die Abfrage gibt nur Zeilen zurück, die keine übereinstimmende Verbindung haben.

Hoffe das wird dir helfen.

3
Joël Salamin

Versuchen:

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

Sehen Demo

Oder Sie könnten zwei LEFT JOINS mit Aliasen wie:

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

Sehen 2nd Demo

2
Edper

Versuchen Sie folgende Abfrage: -

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

Hoffe das hilft dir.

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