2013-03-20 11 views
15

Ho 2 semplici tabelle mysql. Il primo 1 chiamata elettronica e dispone di 2 file:MYSQL - Seleziona solo se la riga in SINISTRA non è presente

sender | receiver 
Marley | Bob 
Saget | Bob 

Il secondo blocco richiamato e ha 1 fila:

blocker | blocked 
    Bob | Marley 

voglio selezionare mittente (s) dal primo tavolo che ha inviato messaggi di posta elettronica Bob ma non sono bloccati nella tabella dei blocchi. Quindi, i risultati dovrebbero essere:

sender 
saget 

Ho provato la seguente query, ma non è di restituire i risultati:

SELECT * FROM mail 
LEFT JOIN block ON (block.blocker = 'Bob') 
WHERE (block.blocked <> mail.sender) 
+1

Ma ' Saget' è bloccato da 'Bob' – Lamak

+0

In realtà il risultato non dovrebbe essere' saget', perché vedi, Bob li ha già bloccati entrambi. –

+0

scusa ho fatto uno sbaglio stupido ... Marley è bloccato solo se non è saget –

risposta

18

La sinistra unirsi produrrà null righe per i disallineamenti.
Sono le righe null da filtrare.

SELECT * FROM mail 
LEFT JOIN block ON (block.blocker = 'Bob') 
WHERE block.blocker IS NULL 

È un po 'strangolare entrare a far parte su un valore fisso tuttavia, un più comune join (dato le tabelle) sarebbe:

SELECT * FROM mail 
LEFT JOIN block ON (block.blocker = mail.receiver 
       and block.blocked = mail.sender)<<-- these should match 
WHERE block.blocker IS NULL      <<-- select only mismatches 
AND mail.receiver like 'bob'; 
+0

Ti stai unendo con il valore hardcoded per "Bob''? E nient'altro ?. Quello non sembra giusto – Lamak

+0

Easy Lamak non è stato fatto con la risposta ... :-) e ancora non ha fatto .... Fatto. – Johan

+0

Quindi, ora hai finito ?. Penso che manchi ancora una condizione, dovresti anche controllare che il mittente sia bloccato – Lamak

9

Prova questo:

SELECT sender 
FROM mail m 
WHERE NOT EXISTS (SELECT 1 FROM block 
        WHERE blocker = m.receiver 
        AND blocked = m.sender) 
+0

Probabilmente dovremmo aggiungere un 'AND Receiver = 'Bob'' poiché specifica che vuole cercare messaggi da Bob. – JNK

+0

@JNK Sì, ho pensato a questo requisito, ma ero esitante nell'aggiungere questa condizione, dal momento che la tabella 'block' è (apparentemente) dovrebbe avere tutti i bloccanti, non solo' Bob' – Lamak

+0

Grazie Lamak :) Sto provando una query diversa che causa anche un altro problema con uno scenario molto simile, quindi la pubblicherà in una nuova domanda –

Problemi correlati