2017-09-23 72 views
0

我有這些表:的毗連一個一對多的連接時表

主持人:

+----+------+---------+-------------+------------+--------+-----------------------+-----------------------+-------+ 
| id | name | url | environment | instanceId | region |  created_at  |  updated_at  | value | 
+----+------+---------+-------------+------------+--------+-----------------------+-----------------------+-------+ 
| 4 | test | testing | qa   | foo  | bar | "2017-09-23 14:57:18" | "2017-09-23 14:57:18" | 1222 | 
+----+------+---------+-------------+------------+--------+-----------------------+-----------------------+-------+ 

ddframes:

+----+-------+-------+ 
| id | value | owner | 
+----+-------+-------+ 
| 1 | 1222 |  4 | 
| 2 | 333 |  4 | 
| 3 | 444 |  4 | 
+----+-------+-------+ 

owner上ddframes是外國id的鑰匙上hosts

我所需的輸出是:

+----+------+---------+-------------+------------+--------+-----------------------+-----------------------+--------------+ 
| id | name | url | environment | instanceId | region |  created_at  |  updated_at  | ddframes | 
+----+------+---------+-------------+------------+--------+-----------------------+-----------------------+--------------+ 
| 4 | test | testing | qa   | hiri  | sdf | "2017-09-23 14:57:18" | "2017-09-23 14:57:18" | 1222,333,444 | 
+----+------+---------+-------------+------------+--------+-----------------------+-----------------------+--------------+ 

凡ddframes連在一起。

我所擁有的是:

SELECT h.*, d.value as ddframes 
FROM hosts h 
INNER JOIN ddframes d 
ON h.id = d.owner 
GROUP BY h.id; 

但它產生類似我期望的輸出只是沒有其他東西ddframes。只有第一個。

這是可以實現的嗎?也許我的桌子的設計是錯的?

回答

4

你想要group_concat()功能:

SELECT h.*, GROUP_CONCAT(d.value) as ddframes 
FROM hosts h INNER JOIN 
    ddframes d 
    ON h.id = d.owner 
GROUP BY h.id; 

我應該注意。一般來說,在GROUP BY查詢中有SELECT *是一個壞主意。假設hosts.id是唯一的(主鍵是),那麼這是可以接受的。實際上,ANSI標準支持GROUP BY中唯一鍵的這種結構。

+0

令人驚歎。謝謝 :) – Moshe