Обновление: добавлено 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