要做這樣的查詢,請從具有所有組合的driver
表(子查詢)開始。然後移除已翻譯的那些:
select driver.*
from (select distinct l.language_id, p.product_id
from languages l cross join
products p
) driver left outer join
translations t
on t.language_id = driver.language_id and
t.product_id = driver.product_id
where t.language_id is null;
這將使用left outer join
,這使在driver
表的一切。如果沒有匹配,那麼translations
中的列將是NULL
- where
子句只保留這些。
如果每個表中的值都是唯一的,則子查詢中可能不需要distinct
。
作爲說明:以上是我最喜歡的編寫查詢的方式,因爲我認爲它是最明確的意圖。但是,MySQL實際上實現了子查詢。因此,如果列在兩個參考表中是唯一的,那麼以下更有效:
select l.*, p.*
from languages l cross join
products p left outer join
translations t
on t.language_id = l.language_id and
t.product_id = p.product_id
where t.language_id is null;