2016-01-07 77 views
0

假設我有3個表格,foo bar和baz,其中bar和baz具有關於foo中的數據集的其他附加信息。有沒有辦法將這3個表連接在一起,以便每個輸出行都可以是(foo <join> bar)(foo <join> baz)數據集?如何連接3個表格以獲得兩個表格的交替結果

說,我有如下表:

mysql> select * from foo; 
+----+-------+ 
| id | foo | 
+----+-------+ 
| 1 | start | 
| 2 | mid | 
| 3 | end | 
+----+-------+ 

mysql> select * from bar; 
+----+-----+-----------+ 
| id | bid | bar  | 
+----+-----+-----------+ 
| 1 | 1 | bar-start | 
| 2 | 2 | bar-mid | 
| 3 | 3 | bar-end | 
+----+-----+-----------+ 

mysql> select * from baz; 
+----+-----+-------------+ 
| id | bid | baz   | 
+----+-----+-------------+ 
| 1 | 1 | baz-start-1 | 
| 1 | 2 | baz-start-2 | 
| 1 | 3 | baz-start-3 | 
| 2 | 4 | baz-mid-1 | 
| 2 | 5 | baz-mid-2 | 
| 2 | 6 | baz-mid-3 | 
| 3 | 7 | baz-end-1 | 
| 3 | 8 | baz-end-2 | 
| 3 | 9 | baz-end-3 | 
+----+-----+-------------+ 

我可以提取所有與它連接這些表一起通過

mysql> select * from foo join bar join baz on foo.id = bar.id and foo.id=baz.id; 
+----+-------+----+-----+-----------+----+-----+-------------+ 
| id | foo | id | bid | bar  | id | bid | baz   | 
+----+-------+----+-----+-----------+----+-----+-------------+ 
| 1 | start | 1 | 1 | bar-start | 1 | 1 | baz-start-1 | 
| 1 | start | 1 | 1 | bar-start | 1 | 2 | baz-start-2 | 
| 1 | start | 1 | 1 | bar-start | 1 | 3 | baz-start-3 | 
| 2 | mid | 2 | 2 | bar-mid | 2 | 4 | baz-mid-1 | 
| 2 | mid | 2 | 2 | bar-mid | 2 | 5 | baz-mid-2 | 
| 2 | mid | 2 | 2 | bar-mid | 2 | 6 | baz-mid-3 | 
| 3 | end | 3 | 3 | bar-end | 3 | 7 | baz-end-1 | 
| 3 | end | 3 | 3 | bar-end | 3 | 8 | baz-end-2 | 
| 3 | end | 3 | 3 | bar-end | 3 | 9 | baz-end-3 | 
+----+-------+----+-----+-----------+----+-----+-------------+ 

但我想獲得像輸出的查詢信息下表,因爲這會使應用程序中的代碼消耗數據更簡單:

+----+-------+------+------+-----------+------+------+-------------+ 
| id | foo | id | bid | bar  | id | bid | baz   | 
+----+-------+------+------+-----------+------+------+-------------+ 
| 1 | start | 1 | 1 | bar-start | NULL | NULL | NULL  | 
| 1 | start | NULL | NULL |   | 1 | 1 | baz-start-1 | 
| 1 | start | NULL | NULL |   | 1 | 2 | baz-start-2 | 
| 1 | start | NULL | NULL |   | 1 | 3 | baz-start-3 | 
| 2 | mid | 2 | 2 | bar-mid | NULL | NULL | NULL  | 
| 2 | mid | NULL | NULL |   | 2 | 4 | baz-mid-1 | 
| 2 | mid | NULL | NULL |   | 2 | 5 | baz-mid-2 | 
| 2 | mid | NULL | NULL |   | 2 | 6 | baz-mid-3 | 
| 3 | end | 3 | 3 | bar-end | NULL | NULL | NULL  | 
| 3 | end | NULL | NULL |   | 3 | 7 | baz-end-1 | 
| 3 | end | NULL | NULL |   | 3 | 8 | baz-end-2 | 
| 3 | end | NULL | NULL |   | 3 | 9 | baz-end-3 | 
+----+-------+------+------+-----------+------+------+-------------+ 

有沒有辦法說服mysql給我一個像最後一個結果集?

回答

1
(
select foo.id as foo_id, foo.foo, bar.id, bar.bid, bar.bar, null, null as baz_bid, null as baz from foo 
join bar on foo.id=bar.id 
) 
union 
(
select foo.id as foo_id, foo.foo, null, null, '', baz.id, baz.bid as baz_bid, baz.baz from foo 
join baz on foo.id=baz.id 
) 
order by foo_id asc, bar desc, baz_bid asc 
相關問題