Это должно работать на MySQL 5.7 или более поздней версии:
SELECT g.id, g.title,
CONCAT('[',
GROUP_CONCAT(
JSON_OBJECT('id', u.id, 'name', u.name)
),
']') AS users
FROM Groups g
JOIN User_Groups ug ON ug.group_id = g.id
JOIN Users u ON ug.user_id = u.id
GROUP BY g.id
ОК. Я протестировал его в песочнице MySQL 5.7.Я получил такой вывод:
+----+------------+-------------------------------------------------------+
| id | title | users |
+----+------------+-------------------------------------------------------+
| 1 | Developers | [{"id": 1, "name": "Bob"},{"id": 2, "name": "Jimmy"}] |
| 2 | Admins | [{"id": 1, "name": "Bob"},{"id": 3, "name": "Jack"}] |
+----+------------+-------------------------------------------------------+
PS: Если кто-нибудь спросит: «Но как нам сделать это на 5.6 без функций JSON?»Я бы предложил вам загрузить неформатированные данные в ваше приложение и отформатировать JSON с помощью кода.Не стоит тратить время на то, чтобы понять, как форматировать JSON, используя только выражения SQL.