我有这个问题:
我有两个表:一个包含用户数据,另一个包含分配给用户的邮政编码(一个用户可以有多个邮政编码)。
包含邮政编码的表格有两列 - 开头和结尾。首先,我需要选择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 :(得分: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