2013-03-23 25 views
7

Mam tabeli użytkowników oraz tabelę rzeczy mają one na liście -wybrać tylko wtedy, gdy pusty

pokazania wszystkich użytkowników, którzy pozycje na liście mogę połączyć dwie tabele users i user_lists na user_id

np.

select u.emailaddr, u.name from users u 
join user_lists uw where u.user_id=uw.user_id 
group by u.name 

PYTANIE: Jak mogę wyświetlić wszystkich użytkowników, którzy NIE mają pozycji na liście - aby powiedzieć to inaczej, muszę listę użytkowników, którzy nie mają wpisy w user_lists stołowych

próbowałem tego, ale zabrakło w nieskończoność

select u.emailaddr, u.name from users u 
join user_lists uw where u.user_id<>uw.user_id 
group by u.name 

Odpowiedz

11

Zastosowanie LEFT JOIN z IS NULL orzecznika:

select u.emailaddr, u.name 
from users u 
LEFT join user_lists uw ON u.user_id = uw.user_id 
WHERE uw.user_id IS NULL; 

Lub:NOT IN orzecznik:

select u.emailaddr, u.name 
from users u 
WHERE u.user_id NOT IN (SELECT user_id 
         FROM user_lists); 
+0

Niesamowite, wielkie dzięki - czy są jakieś preferencje? jest mniej głodny zasobów niż inne? –

+1

@DarrenSweeney - zależy to od twoich danych i ustawień indeksów w twoich tabelach, ale jest trochę rzeczy do zapamiętania; 'JOIN' jest bezpieczniejsze niż predykat' IN' z wartościami 'NULL', jeśli istnieje jakikolwiek" user_id "w drugiej tabeli' user_lists' z wartościami 'NULL', twoje zapytanie nie zwróci niczego. –

+0

Wielkie dzięki ponownie –

0
SELECT u.user_id FROM users u 
EXCEPT 
SELECT uw.user_id FROM user_lists uw 

to daje identyfikatory, które istnieją w użytkownikach i nie istnieją w listach użytkowników.

+0

MySQL nie obsługuje operatora zestawu "EXCEPT". –

Powiązane problemy