2009-07-03 10 views
7

Ich bin mir sicher, das ist einfach, aber wie schreibe ich eine Abfrage in mysql, die zwei Tabellen verbindet und dann nur die Datensätze aus der ersten Tabelle, die nicht übereinstimmen . Ich möchte es so etwas wie sein:Wie bekomme ich nicht passende Ergebnisse in mysql

Select tid from table1 inner join table2 on table2.tid = table1.tid where table1.tid != table2.tid;

aber dies scheint nicht viel Sinn zu machen!

Antwort

15

können Sie ein left outer join verwenden, um dies zu erreichen:

select 
    t1.tid 
from 
    table1 t1 
    left outer join table2 t2 on 
     t1.tid = t2.tid 
where 
    t2.tid is null 

Was dies tut, ist es Ihre erste Tabelle nimmt (table1), verbindet es mit dem zweiten Tisch (table2) und füllt null für die table2 Spalten in einer beliebigen Zeile in table1, die keiner Zeile in table2 entspricht. Dann filtert es das durch Auswählen nur der table1 Zeilen, wo keine Übereinstimmung gefunden werden konnte.

Alternativ können Sie auch not exists verwenden:

select 
    t1.tid 
from 
    table1 t1 
where 
    not exists (select 1 from table2 t2 where t2.tid = t1.tid) 

Dies führt eine left semi join und tut im Wesentlichen die gleiche Sache, dass die left outer join tut. Abhängig von Ihren Indizes kann einer schneller sein als der andere, aber beide sind praktikable Optionen. MySQL hat einige gute Dokumentation auf optimizing the joins, also sollten Sie das überprüfen ..

+2

@ musoNic80 Überprüfen Sie auch http://www.codinghorror.com/blog/archives/000976.html –

Verwandte Themen