2011-02-26 56 views
0

我正在使用表格。为了说明问题:MySQL加入,包括来自返回分隔值的所有值

mysql> SELECT users.id, username, REPLACE(selected_groups, '\r', ', '), groups.id, groups.label FROM users LEFT JOIN groups ON users.selected_groups; 
+----+------------------------+--------------------------------------+------+---------------+ 
| id | username    | REPLACE(selected_groups, '\r', ', ') | id | label   | 
+----+------------------------+--------------------------------------+------+---------------+ 
| 7 | Greg     | 1, 2, 3,        | 1 | Administrator | 
| 7 | Greg     | 1, 2, 3,        | 2 | Member  | 
| 7 | Greg     | 1, 2, 3,        | 3 | Banned  | 
| 8 | Steve     | 1, 2,        | 1 | Administrator | 
| 8 | Steve     | 1, 2,        | 2 | Member  | 
| 8 | Steve     | 1, 2,        | 3 | Banned  | 
| 9 | Steve The Banned Admin | 1, 3,        | 1 | Administrator | 
| 9 | Steve The Banned Admin | 1, 3,        | 2 | Member  | 
| 9 | Steve The Banned Admin | 1, 3,        | 3 | Banned  | 
| 10 | Example man   | 1, 2, 3,        | 1 | Administrator | 
| 10 | Example man   | 1, 2, 3,        | 2 | Member  | 
| 10 | Example man   | 1, 2, 3,        | 3 | Banned  | 
+----+------------------------+--------------------------------------+------+---------------+ 
12 rows in set (0.00 sec) 

正如你所看到的,我有一个用户表和一个组表。在用户表内是一个'selected_groups'列,其中相关组使用返回分隔值('\ r')来定义。

问题是我不太确定我如何在标签字段中返回每个必需的标签。所产生的输出在理想情况下是这样的:

+----+------------------------+--------------------------------------+------+-------------------------------+ 
| id | username    | REPLACE(selected_groups, '\r', ', ') | id | groups.label     | 
+----+------------------------+--------------------------------------+------+-------------------------------+ 
| 7 | Greg     | 1, 2, 3,        | 1 | Administrator, Member, Banned | 
| 8 | Steve     | 1, 2,        | 1 | Administrator, Member   | 
| 9 | Steve The Banned Admin | 1, 3,        | 1 | Administrator, Banned   | 
| 10 | Example man   | 1, 2, 3,        | 1 | Administrator, Member, Banned | 
+----+------------------------+--------------------------------------+------+-------------------------------+ 

你认为这是可能的,如果是这样,没有任何人有任何提示/我的解决方案?

非常感谢, 瑞奇

回答

1

你应该看看group_concat

对于用户标识和用户名以及group_concat标签上的group by子句,它应该做到这一点。

我想是这样的:

SELECT users.id, username, REPLACE(selected_groups, '\r', ', '), GROUP_CONCAT(DISTINCT groups.label) 
FROM users 
LEFT JOIN groups ON users.selected_groups; 
GROUP BY users.id, username 

(这不是测试,所以也许这将需要一些修改)

编辑:我删除从查询中groups.id,因为它没有任何意义。

+0

我似乎无法让它以这种方式工作。在这种情况下,group_concat似乎要做的就是返回每个用户的所有组标签(就好像每个用户在selected_groups字段中都有1 \ r2 \ r3 \ r一样)。 – 2011-02-26 14:33:58

+0

奇怪,它应该工作......我在接下来的几个小时内没有访问过mysql服务器,但我稍后会检查。 – krtek 2011-02-26 16:30:51