2015-10-04 162 views
0

假設我有一個表 'pincodes' 作爲MySQL的GROUP_CONCAT與分離

------------------------------------- 
| id | name | parent_id | value | 
------------------------------------- 
| 1 | State |  0  | 0 | 
| 2 | City1 |  1  | 20220 | 
| 3 | City2 |  1  | 20221 | 

結果我需要的是

-------------------------- 
| 1 | State  |  | 
| 2 | State>City1 | 20220| 
| 3 | State>City2 | 20221| 
-------------------------- 

什麼我嘗試了

SELECT id, 
    GROUP_CONCAT(name ORDER BY parent_id SEPARATOR ' > ') AS name 
FROM pincode 
GROUP BY id ORDER BY name; 

而結果爲上述查詢是

-------------------- 
| 1 | State |  | 
| 2 | City1 | 20220| 
| 3 | City2 | 20221| 
-------------------- 

什麼,我需要的是父母的狀態應該被追加到每個城市。

注意:任何人都可以提出一個更好的問題標題。

+1

你不需要任何聚集。你只需要一個連接。 – Strawberry

+1

指定http://sqlfiddle.com/#!9/d5dd00/1/0的結果,你想得到類似於'State> City1> Subcity1'的結果嗎? – lad2025

回答

2

您可以使用下面的查詢:

SELECT p1.id, CONCAT(COALESCE(CONCAT(p2.name, '>'), ''), p1.name), p1.value 
FROM pincodes AS p1 
LEFT JOIN pincodes AS p2 ON p1.parent_id = p2.id 
ORDER BY p1.id 

你可以使用LEFT JOIN父記錄。使用CONCAT函數可以將父項的名稱與子項的名稱連接起來。

Demo here

編輯:

上面的查詢僅適用於2級的層次結構。對於額外的級別,你必須使用額外的LEFT JOIN操作。對於通用的解決方案,必須使用MySQL中不可用的遞歸CTE。

這是上面的查詢如何可以擴展到處理3層次結構:

SELECT p1.id, 
     CONCAT(COALESCE(CONCAT(p3.name, '>'), ''), 
       COALESCE(CONCAT(p2.name, '>'), ''), 
       p1.name), 
     p1.value 
FROM pincodes AS p1 
LEFT JOIN pincodes AS p2 ON p1.parent_id = p2.id 
LEFT JOIN pincodes AS p3 ON p2.parent_id = p3.id 
ORDER BY p1.id 

Demo here

+1

作者沒有明確規定,但http://sqlfiddle.com/#!9/d5dd00/1/0會產生'City1> Subcity1'而不是'國家> City1> Subcity1',可能遞歸解決方案需要 – lad2025

+0

@ lad2025是, 這是對的。我的查詢僅適用於2級層次結構。對於通用的解決方案,必須使用MySQL中不可用的遞歸CTE。 –

+0

@GiorgosBetsos感謝SQL小提琴!對於我和現在的工作是否只有2級層次結構,這不是問題 – epynic