MySQL запрос — одна строка в одной таблице с несколькими строками в другой таблице

У меня есть следующая модель данных

Table: User
USER ID
USER NAME

Table: Group
GROUP ID
GROUP NAME

Table: User Group
GROUP ID
USER ID

Я пытаюсь отобразить экран со всеми именами групп и связанных пользователей — интерфейс PHP

У меня есть запрос, как показано ниже —

`SELECT a.group_id,
a.group_name,
GROUP_CONCAT(g.user_id) AS user_ids,
GROUP_CONCAT(u.user_fname) AS user_names
FROM   group a, user_group g, user u
WHERE  a.group_id = g.group_id
AND    g.user_id = u.user_id
GROUP BY a.group_id`

Мой вопрос: как вы можете видеть из приведенного выше запроса — мне нужно иметь два списка объединенных строк, которые представляют идентификаторы пользователей и имена пользователей. Это становится головной болью в PHP, как я должен
1. Разнесите обе соединенные строки в массивы
2. Выполнить цикл по обоим массивам и построить из них объекты User.
3. Затем передайте массив объектов

Есть ли более эффективный / лучший способ сделать это? Любые предложения, указатели будут оценены.

1

Решение

Вы хотите только один список?

SELECT g.group_id, g.group_name,
GROUP_CONCAT(g.user_id, ':', u.user_fname) AS names_and_ids
FROM group g join
user_group ug
on g.group_id = ug.group_id join
user u
on ug.user_id = u.user_id
GROUP BY g.group_id, g.group_name;

Обратите внимание на следующие изменения:

  • Я добавил group by так что вы получите один ряд на группу.
  • Я изменил псевдонимы, чтобы они были сокращениями для имен таблиц, чтобы легче было читать запрос.
  • Я модифицировал group_concat() включить как идентификатор пользователя, так и имя пользователя в один список.
  • Я изменил join использовать явное join синтаксис вместо неявных объединений в where пункт.
1

Другие решения

Других решений пока нет …

Похожие вопросы
Добавить ответ
Для оформления сообщений Вы можете использовать следующие тэги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Нажимая кнопку «Отправить», я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности этого сайта.