Mysql group concat при двойном соединении - PullRequest
0 голосов
/ 15 января 2012

У меня есть пользовательская таблица, из которой я хочу получить все значения, поэтому у меня есть этот запрос:

SELECT tbl_user.* FROM tbl_user

Теперь мне нужен еще один столбец в этом результате, который показывает все роли, которые имеет этот пользователь (или ничего, если у него нет ролей). Информация о роли поступает из двух дополнительных таблиц.

Первая таблица содержит эти два значения: userid, roleid Вторая таблица содержит roleid и role_name.

Таким образом, группа concat должна получить все имена ролей на основе ролей в таблице 1.

Я пробовал несколько разных способов сделать это, но у меня ничего не получилось. Либо я получаю только один результат с несколькими одинаковыми ролями, либо вообще никакого результата.

Спасибо за вашу помощь

Michael

1 Ответ

2 голосов
/ 15 января 2012

Обновление: добавлено LEFT JOIN для пользователей без роли.

SELECT
  tbl_user.*,
  GROUP_CONCAT(role_name) AS roles
FROM 
  tbl_user LEFT JOIN tbl_roles ON tbl_user.userid = tbl_roles.userid
  JOIN tbl_rolenames ON tbl_roles.roleid = tbl_rolenames.roleid
GROUP BY tbl_user.userid

Обратите внимание, что MySQL разрешит GROUP BY для меньшего числа столбцов, чем всего в списке SELECT, но в другихСУБД, вам необходимо явно перечислить столбцы в tbl_user и включить их в GROUP BY, или выполнить дополнительное самостоятельное соединение против tbl_user, чтобы получить оставшиеся столбцы из этой таблицы.

Что-то вроде:

SELECT 
  urole.userid,
  uall.username,
  uall.name,
  uall.othercols,
  urole.roles
FROM
  tbl_user uall JOIN (
  SELECT 
    tbl_user.userid, 
    GROUP_CONCAT(role_name) AS roles
  FROM 
    tbl_user LEFT JOIN tbl_roles ON tbl_user.userid = tbl_roles.roleid
    JOIN tbl_rolenames ON tbl_roles.roleid = tbl_rolenames.roleid
  GROUP BY tbl_user.userid
) urole ON uall.userid = urole.userid
...