2012-06-10 2 views
24

Ich kann nicht scheinen, dies bis jetzt herauszufinden. Ich versuche, zwei Tabellen zu verbinden und nur die Zeilen in Tabelle A auszuwählen, die keine übereinstimmende Spalte in Tabelle B haben. Angenommen, wir haben beispielsweise eine Benutzertabelle und eine gesendete Tabelle.MySQL wählen Zeilen, die keine übereinstimmende Spalte in anderen Tabelle haben

users Tabelle hat die folgenden Spalten: id, username
sent Tabelle hat die folgenden Spalten: id, username

Ich möchte alle Zeilen aus users auszuwählen, in dem username nicht in sent Tabelle nicht vorhanden ist. Wenn also tom in users und in sent ist, wird er nicht ausgewählt. Wenn er in users, aber nicht in sent ist, wird er ausgewählt. Ich habe versucht, diese aber es hat nicht funktioniert:

SELECT pooltest.name,senttest.sentname 
FROM pooltest,senttest 
WHERE pooltest.name != senttest.sentname 

Antwort

12

Versuchen Sie, diese SQL:

SELECT users.username 
FROM users 
LEFT JOIN sent ON sent.username = users.username 
WHERE sent.username IS NULL; 

Der bessere Weg, meiner Meinung nach wäre:

SELECT users.username 
FROM users 
LEFT JOIN sent ON sent.id = users.id 
WHERE sent.id IS NULL; 

sowohl als ID-Felder würde (Primärschlüssel Ich hätte das gedacht) indiziert werden, so Diese Abfrage wäre besser optimiert als die erste, die ich vorgeschlagen habe.

Sie finden jedoch möglicherweise meinen ersten Vorschlag besser für Sie, es hängt davon ab, was Ihre Anforderungen für Ihre Anwendung sind.

+0

durch einige lösen andere Hilfe Ich fand auch, dass dies funktioniert: SELECT * FROM pooltest LINKER JOIN senttest ON pooltest.name = senttest.sentname WHERE senttest.sendname IS NULL – xendi

53

Normalerweise würden Sie NOT EXISTS für diese Art der Abfrage

SELECT p.Name 
FROM pooltest p 
WHERE NOT EXISTS (SELECT s.Name 
        FROM senttest s 
        WHERE s.Name = p.Name) 

Eine Alternative eine LEFT OUTER JOIN und überprüfen zu verwenden wäre verwenden für NULL

SELECT p.Name 
FROM pooltest p 
     LEFT OUTER JOIN senttest s ON s.Name = p.Name 
WHERE s.Name IS NULL 

Beachten Sie, dass die implizite Joinsyntax, die Sie verwenden, als obsolet betrachtet wird und durch einen expliziten Join ersetzt werden sollte.

-3

dieses kann man sein kann helfen ....

Ich hatte auch das gleiche Problem aber gelöst dies mit dieser Abfrage

INSERT INTO tbl1 (id,name) SELECT id,name from tbl2 where (name) not in(select name from tbl1); 

Hoffnung dieses Ihr Problem