2016-08-15 193 views
1

比方說,我有這樣的模式:MySql的重複值聯接使用GROUP_CONCAT

_________        _________ 
| Table 1 |        | Table 2 | 
|---------|   _______ ________|---------| 
| id_a |___  | link1 | |  | id_b | 
| name | |  |-------| |  | info | 
|_________| |_____| id_a |___|  | data | 
    |    | id_b |   |_________| 
    |    |_______| 
    | 
    |    _______ 
    |______________| link2 |_______ 
        |-------|  | 
        | id_a |  | _________ 
        | id_c |  |__| Table 3 | 
        |_______|   |---------| 
             | id_c | 
             | email | 
             |_________| 

與數據庫中的這些信息:

表1

_____________ 
| id_a | name | 
|------|------| 
| 1 | foo | 
|______|______| 

表2

_____________________ 
| id_b | info | data | 
|------|------|-------| 
| 1 | bar | corge | 
| 2 | kux | corge | 
| 3 | fred | quux | 
|______|______|_______| 

表3

_________________ 
| id_c | email | 
|------|----------| 
| 1 | [email protected] | 
| 2 | [email protected] | 
| 3 | [email protected] | 
| 4 | [email protected] | 
| 5 | [email protected] | 
|______|__________| 

鏈接1

_____________ 
| id_a | id_b | 
|------|------| 
| 1 | 1 | 
| 1 | 2 | 
| 1 | 3 | 
|______|______| 

鏈接2

_____________ 
| id_a | id_c | 
|------|------| 
| 1 | 1 | 
| 1 | 2 | 
| 1 | 3 | 
| 1 | 4 | 
| 1 | 5 | 
|______|______| 

當我試圖找回我想要的DATAS,我使用以下語法:

SELECT t1.*, 
     GROUP_CONCAT(DISTINCT t2.info SEPARATOR '|') AS info, 
     GROUP_CONCAT(DISTINCT t2.data SEPARATOR '|') AS data, 
     GROUP_CONCAT(DISTINCT t3.email SEPARATOR '|') AS email 
FROM table1 AS t1 
LEFT JOIN link1 AS l1 
ON l1.id_a = t1.id_a 
LEFT JOIN table2 AS t2 
ON t2.id_b = l1.id_b 
LEFT JOIN link2 AS l2 
ON l2.id_a = t1.id_a 
LEFT JOIN table3 AS t3 
ON t3.id_c = l2.id_c 
WHERE t1.id_a = ? 
GROUP BY t1.id_a 

的問題是,當我有在列兩個或更多個相同的值(例如具有「表2」 /「數據」)結果不到風度給予相同數量的的連接值:

array(
    'id_a' => '1', 
    'info' => 'bar|kux|fred', 
    'data' => 'corge|quux', 
    'email' => '[email protected]|[email protected]|[email protected]|[email protected]|[email protected]' 
) 

當我需要連接值是完全一樣的號碼在我的代碼中使用它們作爲一個單一的輸出(例如酒吧Corge,庫克斯Corge,弗雷德QUUX),我想知道是否有可能獲得他們,因爲我直接期待他們的要求?

回答

0

所以我回答自己。我正在尋找的是CONCAT_WS。我的要求成爲

SELECT t1.*, 
     GROUP_CONCAT(DISTINCT CONCAT_WS(
      ' ', t2.info, t2.data 
     ) SEPARATOR ', ') AS info, 
     GROUP_CONCAT(DISTINCT t3.email SEPARATOR '|') AS email 
FROM table1 AS t1 
LEFT JOIN link1 AS l1 
ON l1.id_a = t1.id_a 
LEFT JOIN table2 AS t2 
ON t2.id_b = l1.id_b 
LEFT JOIN link2 AS l2 
ON l2.id_a = t1.id_a 
LEFT JOIN table3 AS t3 
ON t3.id_c = l2.id_c 
WHERE t1.id_a = ? 
GROUP BY t1.id_a