2013-03-23 12 views
7

Ho una tabella di utenti e un tavolo di cose che hanno in un elenco -Selezionare solo se vuota

per mostrare tutti gli utenti che dispongono di elementi in un elenco posso unire le due tabelle users e user_lists su user_id

ad es.

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

DOMANDA: Come posso mostrare tutti gli utenti che FARE NON dispone di elementi in un elenco - per dirla in un altro modo, ho bisogno di un elenco di utenti che non hanno voci in user_lists tabella

ho provato questo ma correva all'infinito

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

risposta

11

Usa LEFT JOIN con IS NULL predicato:

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; 

Oppure: Il NOT IN predicato:

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

Impressionante, molte grazie - c'è una preferenza? è una risorsa in meno affamata rispetto alle altre? –

+1

@DarrenSweeney - Dipende dai dati e dall'impostazione degli indici nelle tabelle, ma c'è una piccola cosa da notare; 'JOIN' è più sicuro del predicato' IN' con i valori 'NULL', se c'è qualche' user_id' nell'altra tabella 'user_lists' con valori' NULL', la tua query non restituirà nulla. –

+0

Molte grazie ancora –

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

che vi darà gli ID che esistono in utenti e non esistono in di elenchi.

+0

MySQL non supporta l'operatore set "EXCEPT". –

Problemi correlati