Присоединяйся ко многим и объединяй множество рефери в один ряд - PullRequest
0 голосов
/ 27 мая 2019

Я советовался с похожими вопросами, но вопрос другой, так как я присоединился не только ко многим, но и ко многим.

Пользователь

+----+-------+---------------+
| id | first | department_id |
+----+-------+---------------+
|  1 | John  | 1             |
|  2 | Jane  | 2             |
+----+-------+---------------+

отдел

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

роль

+----+----------+
| id |   name   |
+----+----------+
|  1 | admin    |
|  2 | accounts |
|  3 | sales    |
+----+----------+

USER_ROLE

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

SQL

SELECT user.first, GROUP_CONCAT(role.name), department.id AS 'department.id', department.name AS 'department.name'
FROM user 
INNER JOIN department ON user.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.name;

1018 * Expectation *

John, "admin,accounts,sales", 1, purchasing
Jane, "accounts,sales", 2, HR

По сути, это объединение в 4 таблицы, со многими ко многим и 1 со многими с групповой функцией concat.

запрос выдает ошибку.

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

1 Ответ

1 голос
/ 27 мая 2019

Поскольку отдел уникален для каждого пользователя, вы можете использовать max() для получения сведений об отделе, чтобы преодолеть ограничения, налагаемые 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

Кроме того, псевдонимы столбцов не должны быть заключены в одинарные кавычки.Вместо этого используйте галочки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...