2012-08-04 49 views
0

什麼是以下查詢的語法JOIN:MySQL的語法取決於條件

獲取從表1中的所有列和JOIN表2,如果匹配的參考(Table1ID)存在,否則JOIN表3。

簡體DB結構或多或少如下

Table1 
ID  Type 
1  std 

Table2 
ID  Table1ID Title Language 
1  1   Test  en 

Table3 
ID  Table1ID Title Language  Flag 
1  1   Other en   1 

另外,我現在認識到,表3將具有指單個Table1.id多個條目。如何限制它只返回每個結果的最新條目(ID最高)?

回答

2

如果你不想爲每個參加整個單獨的一組列的,這可能是你在找什麼:

SELECT * 
FROM  (  
     SELECT a.ID AS Table1ID, a.Type, b.ID, b.Title, b.Language, NULL AS Flag 
     FROM  Table1 a 
     JOIN  Table2 b ON a.ID = b.Table1ID 

     UNION ALL 

     SELECT a.ID, a.Type, c.ID, c.Title, c.Language, c.Flag 
     FROM  Table1 a 
     LEFT JOIN Table2 b ON a.ID = b.Table1ID 
     JOIN  Table3 c ON a.ID = c.Table1ID 
     JOIN  (
        SELECT MAX(id) AS maxid 
        FROM  Table3 
        GROUP BY Table1ID 
        ) d ON c.ID = d.maxid 
     WHERE  b.ID IS NULL 
     ) a 
ORDER BY a.Table1ID 

SQLFiddle Demo

+0

謝謝......我知道,表3將有多個引用相同table1.id的條目。我如何取最近的一個(每個結果的最高table1.id)? – 2012-08-04 18:19:35

+0

@ vault-boy,你的意思是最高的'table3.id'? – 2012-08-04 18:21:21

+0

是的,最高的table3.id – 2012-08-04 18:23:55

1

這是一種方法。

select table1.id, table1.type, ifnull(table2.title, table3.title) 
from table1 
left join table2 on table1.id = table2.table1ID 
left join table3 on table1.id = table3.table1ID 
+0

嗯。這並不完全捕捉到問題的獨有性質或性質:只需將'和table2.table1ID IS NULL'添加到最後。 – eggyal 2012-08-04 17:30:52

+0

謝謝,這個工程。但是,它返回的結果太多,因爲第一個結果爲NULL,並且它對於不存在的table1.id = 1。我在table1中的第一個條目當前的ID爲5 – 2012-08-04 17:52:10

+0

實際上,如果我選擇table1。*我沒有得到那空洞的結果。只有在選擇table1.id時得到它 – 2012-08-04 17:56:35