2014-09-17 16 views
14

mam tych tabel MySQL:MySQL wybierz wiersze gdzie LEFT JOIN jest null

Tabela 1:

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

Table2:

user_one | user_two 
    1  | 2 

a to zapytanie:

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

To zapytanie zwróci wszystkie wiersze tabeli1 które są 1,2,3

Chcę wybrać tylko wiersze, które nie występują w lewym złączu. Powinno więc zwrócić tylko wiersz o identyfikatorze 3

Chcę coś przeciwnego do INNER JOIN, które wybierze tylko wiersze znalezione w łączeniu. Jak uzyskać przeciwieństwo, jak gdyby istniało lewe połączenie, zignoruj ​​je i przejdź do następnego rzędu. Nadzieję, że jestem jasne

+3

Dodaj 'gdzie table2.user_one ma wartość null'. –

+0

@GordonLinoff Tylko dla mnie możesz wydłubać tę logikę, aby dodać 'where table2.user_one is null' ponieważ myślę, że powróci on 2 i 3, ale użytkownik chce tylko 3. –

+0

Jaka jest struktura' table2'? Dwie kolumny "user_one" i "user_two"? –

Odpowiedz

20

Można użyć następującego zapytania:

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

Choć, w zależności od indeksów table2 może się okazać, że dwa przyłącza działa lepiej:

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; 
1

Try następujące zapytanie: -

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

Nadzieja to pomaga.

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

Oto zapytanie, które zwraca tylko te wiersze, w których nie correspondance został znaleziony w obu kolumnach user_one i user_two z 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 

Jest jedna jointure dla każdej kolumny (user_one i user_two) a zapytanie zwraca tylko wiersze, które nie mają pasującej fuzji.

Mam nadzieję, że to ci pomoże.

2

Spróbuj:

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 

Zobacz Demo

Albo można użyć dwóch LEFT JOINS z aliasów jak:

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 

Zobacz 2nd Demo

10

jeden z najlepszych podejścia, jeśli nie chcesz, aby powrócić żadnych kolumn z table2 jest użycie 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) 

semantycznie to mówi o co chcesz zapytać: Wybierz każdy wiersz, w którym nie ma pasującego rekordu w drugiej tabeli.

MySQL jest zoptymalizowany pod kątem EXISTS: Powraca, gdy tylko znajdzie pierwszy pasujący rekord.