Mysql 连接多对多并将多个参照合并到一行中

Mysql 连接多对多并将多个参照合并到一行中,mysql,sql,Mysql,Sql,我也问过类似的问题,但问题是不同的,因为我加入的不仅仅是多对多,还有一对多 使用者 系 +----+------------+ | id | name | +----+------------+ | 1 | purchasing | | 2 | HR | | 3 | marketing | +----+------------+ 角色 用户角色 +--------+----------+ | user_id | role_id | +--------+---

我也问过类似的问题,但问题是不同的,因为我加入的不仅仅是多对多,还有一对多

使用者

+----+------------+
| id |   name     |
+----+------------+
|  1 | purchasing |
|  2 | HR         |
|  3 | marketing  |
+----+------------+
角色

用户角色

+--------+----------+
| user_id | role_id |
+--------+----------+
|      1  |       1 |
|      1  |       2 |
|      1  |       3 |
|      2  |       2 |
|      2  |       3 |
+--------+----------+
sql

期望值

John, "admin,accounts,sales", 1, purchasing
Jane, "accounts,sales", 2, HR
本质上,它是一个4表连接,具有多对多和1对多的groupconcat函数

查询给出了一个错误

Error Code: 1055. Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'department.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

由于部门对于每个用户都是唯一的,因此您可以使用
max()
获取部门详细信息,以克服
分组方式所带来的限制

SELECT 
  user.first, 
  GROUP_CONCAT(role.name) AS roles, 
  max(department.id) AS department_id, 
  max(department.name) AS department_name
FROM user 
INNER JOIN department ON user.department_id = department.id
INNER JOIN user_role ON user.id = user_role.user_id
INNER JOIN role ON user_role.role_id = role.id
GROUP BY user.first;
此外,如果用户名不唯一,您应该:

GROUP BY user.id, user.first

此外,列的别名不能用单引号括起来。请改用反勾号。

您的查询的输出是什么?我有错误,请查看我的编辑。我看到了,明白了。您使用max是因为mysql将每一列限制为聚合函数,对吗?是的,选择列表中的每一列都必须在group by子句或AGREGRADED.ok中。此限制是通过使用
group_CONCAT
函数施加的,或者是因为group by的
group by
子句施加的。GROUP_CONCAT()是一个聚合列。作为max()的替代方法,您可以使用任意_值()。我刚刚做了测试,没有使用
max
any_值
,它可以工作,我不知道。有什么想法吗
Error Code: 1055. Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'department.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
SELECT 
  user.first, 
  GROUP_CONCAT(role.name) AS roles, 
  max(department.id) AS department_id, 
  max(department.name) AS department_name
FROM user 
INNER JOIN department ON user.department_id = department.id
INNER JOIN user_role ON user.id = user_role.user_id
INNER JOIN role ON user_role.role_id = role.id
GROUP BY user.first;
GROUP BY user.id, user.first