我有一个看起来或多或少像这样的表:
user is_su last_login roles_for_groups
+------+---+------------+----------------------------+
| rob | 1 | 2018-02-09 | admin, read |
+------+---+------------+----------------------------+
| gian | 0 | 2018-06-21 | prod_full_access, readOnly |
+------+---+------------+----------------------------+
| gian | 0 | 2018-06-21 | prod_full_access, CCT |
+------+---+------------+----------------------------+
| rob | 1 | 2018-02-09 | admin, write |
+------+---+------------+----------------------------+
并且我想将具有相同用户的所有行合并为单行,以使得表格看起来像这样:
+------+---+------------+---------------------------------+--+
| rob | 1 | 2018-02-09 | admin, read, write | |
+------+---+------------+---------------------------------+--+
| gian | 0 | 2018-06-21 | prod_full_access, readOnly, CCT | |
+------+---+------------+---------------------------------+--+
我怎样才能做到这一点?
为什么不用你想要的方式查询数据,使用GROUP_CONCAT
和DISTINCT
:
SELECT
user,
is_us,
last_login,
GROUP_CONCAT(DISTINCT roles_for_groups) roles_for_groups
FROM yourTable
GROUP BY
user,
is_us,
last_login;
目前尚不清楚is_us
和last_login
列是否总是在功能上依赖于user
。如果没有,那么您应该包含一些显示此行为的示例数据。
select a.user,a.is_su,a.last_login,group_concat(distinct a.roles_for_groups separator ',' )
from (select user,is_su,last_login,substring_index(roles_for_groups,',',1) as roles_for_groups from table union select user,is_su,last_login,substring_index(roles_for_groups,',',-1) as roles_for_groups from table) a group by a.user
此查询仅适用于包含两个值的roles_for_groups