Mysql concat问题

时间:2011-09-18 11:36:05

标签: mysql formatting

我有这个问题:

我有两个表:一个包含用户数据,另一个包含分配给用户的邮政编码(一个用户可以有多个邮政编码)。

包含邮政编码的表格有两列 - 开头和结尾。首先,我需要选择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行

如果有人帮我一把,这对我有帮助,谢谢。

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