2009-07-03 24 views
7

Bunun doğrudan doğruya olduğundan eminim, ancak mysql'de iki tabloya katılan bir sorguyu nasıl yazabilirim ve sonra yalnızca eşleşen ilk tablodaki kayıtları döndürürüm . Ben bunu istiyorum gibi bir şey:Eşleşmeyen sonuçları nasıl alırım mysql

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

ama bu anlamda bir sürü yapmak gibi görünmüyor!

cevap

15

Bunu gerçekleştirmek için left outer join kullanabilirsiniz:

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

ne yapar sizin ikinci tabloda (table2) ile birleştiren, ilk tablo (table1) alır ve table2 için null doldurur olduğunu table1'daki herhangi bir satırdaki table2 numaralı satırdaki bir satır ile eşleşmeyen sütunlar. Ardından, hiçbir eşleşme bulunamayan yalnızca table1 satırını seçerek bunu filtreler.

Alternatif olarak, not exists kullanabilirsiniz:

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

Bu left semi join gerçekleştirir ve left outer join yaptığının aynısını yapmak esasen olacaktır. Dizinlerinize bağlı olarak, diğerinden daha hızlı olabilir, ancak her ikisi de uygun seçenekler olabilir. MySQL, optimizing the joins üzerinde bazı iyi belgelere sahiptir, bu yüzden bunu kontrol etmelisiniz ..

+2

@ musoNic80 Ayrıca bkz http://www.codinghorror.com/blog/archives/000976.html –

İlgili konular