2011-09-18 111 views
2

我有這樣的問題:Mysql的問題的concat

我有兩個表:一個用戶數據和一個與分配給用戶(一個用戶可以擁有多個郵政編碼)郵政編碼。

郵政編碼表有兩列 - 開始和結束。首先,我需要選擇START和END,並將它們分開。與 - 。我知道我可以使用CONCAT_WS來做到這一點,但我也需要將這些連接的字符串(有多行)連接成一行。

我已經有這個疑問:

SELECT pc.user_id, CONCAT_WS('-', pc.start, pc.end) FROM postal_codes pc, users u WHERE u.id=pc.user_id 

不過就是你期望它給我的結果是這樣的:(對不起,我不知道怎麼在這裏插入表格)

row | user_id | postal range 
============================ 
1 | 1  | AAAA-BBBB 
---------------------------- 
2 | 1  | CCCC-DDDD 
---------------------------- 
3 | 1  | MMMM-NNNN 
---------------------------- 
4 | 2  | CCCC-DDDD 
---------------------------- 
5 | 2  | EEEE-FFFF 
---------------------------- 

和我需要的是這樣的:

row | user_ID | postal_range 
---------------------------- 
1 | 1  | AAAA-BBBB, CCCC-DDDD, MMMM-NNNN 
---------------------------- 
2 | 2  | CCCC-DDDD, EEEE-FFFF 
---------------------------- 

我知道我可以使用GROUP_CONCAT如果我想連接多行 - 但如果我包裹上一個查詢的結果爲GROUP_CONCAT這樣的:

SELECT pc.user_id, (GROUP_CONCAT((SELECT CONCAT_WS('-', pc.start, pc.end) FROM bs_postal_codes pc, bs_users u WHERE u.id=pc.user_id) SEPARATOR ', ')) FROM bs_postal_codes pc 

它給我的錯誤:子查詢返回多個1行

這將真正幫助我,如果有人給我這個手,謝謝。

+0

這也許不是,但在SQLite的我有使用'end'作爲列名的問題。 – Francisc

+0

好的第一個問題。我想知道你是否真的想保留這個用戶名。 –

回答

2

GROUP_CONCAT作爲所有集合函數在它們所屬的查詢中工作(外部查詢)。您不能將SELECT語句添加爲返回多行的參數。

試試這個:

SELECT 
    pc.user_id, 
    GROUP_CONCAT(CONCAT_WS('-', pc.start, pc.end) SEPARATOR ', ') as codes 
FROM 
    bs_postal_codes pc 
GROUP BY 
    pc.user_id 

加成(見註釋):

1.

SELECT 
    u.id, 
    /* Optional other user fields. Add them to Group By too, */ 
    GROUP_CONCAT(CONCAT_WS('-', pc.start, pc.end) SEPARATOR ', ') as codes 
FROM 
    users u 
    LEFT JOIN bs_postal_codes pc ON pc.user_id = u.id 
GROUP BY 
    u.id 

2.

SELECT 
    u.id, 
    /* Optional other user fields. Add them to Group By too, */ 
    (SELECT 
    GROUP_CONCAT(CONCAT_WS('-', pc.start, pc.end) SEPARATOR ', ') 
    FROM 
    bs_postal_codes pc 
    WHERE 
    pc.user_id = u.id) as codes 
FROM 
    users u 
+0

謝謝,我愛你! –

+0

不好意思打擾你,但是我怎麼還可以添加沒有分配任何郵政編碼的用戶? –

+0

您可以使用'用戶'作爲駕駛臺,並將郵政編碼加入。第二種解決方案是在子選擇中選擇整個郵政編碼列表。請注意,在這種情況下你不需要分組。我添加了兩個解決方案的答案。檢查哪一個最適合你(檢查性能呢!)。 – GolezTrol