group_concat в пустом соединении в MySQL - PullRequest
4 голосов
/ 08 марта 2010

У меня следующая проблема: У меня есть две таблицы: (упрощенно)

+--------+    +-----------+
| User   |    | Role      |
+--------+    +-----------+
| ID<PK> |    | ID <PK>   |
+--------+    | Name      |
              +-----------+

и отношение M: N между ними

+-------------+   
| User_Role   |   
+-------------+
| User<FK>    |
| Role<FK>    |
+-------------+

Мне нужно создать представление, которое выбирает меня: Пользователь и в одном столбце все его роли (это делается group_concat).

Я пробовал следующее:

SELECT u.*, group_concat(r.Name separator ',') as Roles FROM 
  User u
  LEFT JOIN User_Role ur ON ur.User=u.ID
  LEFT JOIN Role r ON ur.Role=r.ID
 GROUP BY u.ID;

Однако это работает для пользователя с некоторыми определенными ролями. Пользователи без роли не возвращаются. Как я могу изменить оператор, чтобы он возвращал мне пользователя с пустой строкой в ​​столбце Роли, если у пользователя нет роли?

Объяснение: Я передаю данные SQL непосредственно в сетку, которая затем форматируется, и мне легче создавать медленное и сложное представление, чем форматировать его в моем коде.

Я использую MySQL

1 Ответ

5 голосов
/ 08 марта 2010

Я попробовал ваш SQL и у меня нет pb для его запуска, все строки возвращаются даже пользователю без роли, единственное, что у вас есть ноль в столбце ролей, чтобы избежать использования функции COALESCE для получения пустая строка, когда поле будет NULL.

SELECT u.*, group_concat(COALESCE(r.Name, "") separator ',') as Roles FROM 
  User u
  LEFT JOIN User_Role ur ON ur.User=u.ID
  LEFT JOIN Role r ON ur.Role=r.ID
 GROUP BY u.ID;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...