2012-08-04 50 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