2013-03-20 7 views
15

Ich habe 2 einfache MySQL-Tabellen. Die erste 1 genannte Mail und hat zwei Reihen:MYSQL - Wählen Sie nur, wenn Zeile in LINKER JOIN nicht vorhanden ist

sender | receiver 
Marley | Bob 
Saget | Bob 

Die zweiten genannten Block und hat 1 Reihe:

blocker | blocked 
    Bob | Marley 

Ich mag Absender auszuwählen (n) aus der ersten Tabelle, die Bob-E-Mails gesendet sind aber in der Blocktabelle nicht blockiert. So sollten die Ergebnisse sein:

sender 
saget 

Ich habe versucht, die folgende Abfrage, aber es ist nicht Ergebnisse der Rückkehr:

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

Aber ' Saget' wird von 'Bob' blockiert – Lamak

+0

Eigentlich sollte das Ergebnis nicht" saget "sein, denn Bob hat bereits beide blockiert. –

+0

Entschuldigung, ich habe einen dummen Fehler gemacht ... marley ist nur blockiert, während sage nicht –

Antwort

18

Die linke beitreten null Zeilen für die Mismatches erzeugen.
Es sind diese null Zeilen, die Sie filtern müssen.

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

Es ist eine Art erwürgen jedoch auf einen festen Wert zu verbinden, ein häufiger (bei Tabellen) join wäre:

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

Sie sind mit dem hardcoded Wert für "Bob" verbunden, und sonst nichts ?. Das scheint nicht richtig zu sein – Lamak

+0

Easy Lamak war nicht mit der Antwort fertig ... :-) und noch nicht fertig .... Fertig. – Johan

+0

So, jetzt bist du fertig ?. Ich denke, dass dies noch eine Bedingung fehlt, sollten Sie auch überprüfen, dass der Absender blockiert wird – Lamak

9

starten:

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

setzen Wahrscheinlich sollte ein 'AND Receiver = 'Bob' hinzufügen, da er angibt, er will Suche nach Nachrichten von Bob. – JNK

+0

@JNK Ja, ich dachte über diese Anforderung nach, aber zögerte, diese Bedingung hinzuzufügen, da die 'Block'-Tabelle (anscheinend) alle Blocker haben sollte, nicht nur' Bob' – Lamak

+0

Dank Lamak :) Ich versuche es jetzt eine andere Abfrage, die auch ein anderes Problem mit einem sehr ähnlichen Szenario verursacht, so wird es in einer neuen Frage veröffentlichen –

Verwandte Themen