2011-09-18 33 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