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