某网站的后台管理,新建一个用户时,需要指派给其一个角色,该角色具有一定权限:
比如,“销售专员”这个角色有A,B,C的权限,“销售经理”这个角色有A,B,C,E的权限,“财务”这个角色有B,C,D,E,F的权限。
(直接可以理解为ORACLE数据库中的“角色-权限”)
开发的同学需求是知道某个角色,获取其全部的权限,并在一条row中显示。
测试表建立:
-
CREATE TABLE `a` (
-
`id` int(11) DEFAULT NULL,
-
`name` char(1) DEFAULT NULL
- ) ENGINE=InnoDB DEFAULT CHARSET=latin1
- INSERT INTO a SELECT 1,'A';
- INSERT INTO a SELECT 1,'B';
- INSERT INTO a SELECT 1,'C';
- INSERT INTO a SELECT 2,'A';
- INSERT INTO a SELECT 2,'B';
-
mysql> SELECT * FROM a;
-
+------+------+
-
| id | name |
-
+------+------+
-
| 1 | A |
-
| 1 | B |
-
| 1 | C |
-
| 2 | A |
-
| 2 | B |
-
+------+------+
- 5 rows in set (0.00 sec)
-
+------+---------+
-
| id | name |
-
+------+---------+
-
| 1 | C,A,A,B |
-
| 2 | A,B |
- +------+---------+
这里就需要用到GROUP_CONCAT函数
官方给出的简介是:
|
GROUP_CONCAT() |
Return a concatenated string |
给出的语法和例子是:
This function returns a string result with the concatenated non-NULL values from a group. It returns NULL if there are no non-NULL values. The full syntax is as follows:
GROUP_CONCAT([DISTINCT] expr [,expr ...]
[ORDER BY {unsigned_integer | col_name | expr}
[ASC | DESC] [,col_name ...]]
[SEPARATOR str_val])
mysql> SELECT student_name,
-> GROUP_CONCAT(test_score)
-> FROM student
-> GROUP BY student_name;
Or:
mysql> SELECT student_name,
-> GROUP_CONCAT(DISTINCT test_score
-> ORDER BY test_score DESC SEPARATOR ' ')
-> FROM student
-> GROUP BY student_name;
简单来说,可以通过:
- mysql> SELECT id , GROUP_CONCAT(name) name
- -> FROM a
- -> GROUP BY id;
-
+------+---------+
-
| id | name |
-
+------+---------+
-
| 1 | A,A,B,C |
-
| 2 | A,B |
- +------+---------+
当然也可以对其的分隔符进行修改:
-
mysql> SELECT id, GROUP_CONCAT(name SEPARATOR ';')
-
-> FROM a
- -> GROUP BY id;
同样也可以对name列进行排序:
-
mysql> SELECT id, GROUP_CONCAT(name ORDER BY name DESC) name
-
-> FROM a
-
-> GROUP BY id;
-
+------+---------+
-
| id | name |
-
+------+---------+
-
| 1 | C,B,A,A |
-
| 2 | B,A |
-
+------+---------+
- 2 rows in set (0.00 sec)
当然官方还给出了可以通过DISTINCT来排除冗余
用法如下:
-
mysql> SELECT id, GROUP_CONCAT(DISTINCT name) name
-
-> FROM a
-
-> GROUP BY id;
-
+------+-------+
-
| id | name |
-
+------+-------+
-
| 1 | A,B,C |
-
| 2 | A,B |
-
+------+-------+
- 2 rows in set (0.00 sec)
作者公众号(持续更新)
