Как вывести многомерный массив из нескольких реляционных таблиц MySQL? - PullRequest
0 голосов
/ 29 января 2010

У меня есть три таблицы: событие, события и пользователи. В таблице «Событие» хранится информация, относящаяся к определенному событию (имя, дата и т. Д.), В таблице «Пользователи» хранится информация о пользователе (имя, возраст и т. Д.), А таблица «События» является реляционной между ними, сохраняя только Event_ID и User_ID. *

Мне нужно перечислить все события для определенного пользователя (скажем, User_ID = 20) и показать всех остальных пользователей, которые также участвуют в этом событии, под каждым.

Например, предположим, что пользователь собирается на «День рождения Стива», «Вечеринку возвращения домой» и «Арт-шоу в центре города». Мне нужно отобразить:

День рождения Стива - Также собирается: Сара, Майк, Том Homecoming Party - Также собираются: Майк, Энди, Роджер, Стив Art Show Downtown - Также собирается: Сара

Я попытался сначала выполнить запрос к базе данных, чтобы найти все Event_ID в таблице Events, которые соответствуют User_ID. Затем я беру этот массив и для каждого нахожу event_name и event_date. Но я слишком запутываюсь, пытаясь понять, как найти каждого человека, который тоже идет на это событие.

Кто-нибудь может понять, что я пытаюсь сделать, и предложить метод, чтобы осуществить это?

Ответы [ 2 ]

2 голосов
/ 29 января 2010

Что-то вроде

SELECT 
  e.Name,
  Concat_WS(', ', u.Name) AS AlsoGoing
  /* maybe some more stuff */
FROM
  Events eu
LEFT JOIN Events a
  ON (eu.Event_ID = a.Event_ID)
LEFT JOIN Users u
  ON u.User_ID = a.User_ID
LEFT JOIN Event e
  ON (eu.Event_ID = e.Event_ID)
WHERE
  eu.User_ID = 20 /* or some other ID */
  AND a.User_ID <> eu.User_ID
GROUP BY
  eu.Event_ID;     

Первое соединение создает отношение «кто еще идет на то же событие». Предложение where отфильтровывает идентичных пользователей (если список составлен для Стивена, он не будет отображаться в «кто еще идет») и выбирает только те события, которые посещает Стивен. Второе и третье присоединение просто добавляют пользователя и информацию о событии к идентификаторам. Группировка по событию с использованием (разделенных) гарантирует, что вы получаете по одной строке на событие (с «людьми, которые также подведены»).

2 голосов
/ 29 января 2010

Вы можете использовать подвыбор в предложении in и что-то вроде этого:

SELECT `event`.*, `user`.* from `user`,`user_event`, `event` 
WHERE `event`.`id` in (
   SELECT `user_event`.`event_id` from `user_event`, `user` 
   WHERE `user`.`id` = ?
)
AND `user`.`id` = `user_event`.`user_id`
AND `user_event`.`event_id` = `event`.`id`
ORDER BY `event`.`id`

Что в основном гласит: найти всех пользователей, идущих на следующие события - список событий можно найти, взяв event_ids событий, на которые собирается Джо.

В подразделе я не извлекаю таблицу событий, потому что получаю достаточно информации (event_id) из таблицы «многие ко многим».

В строках будут избыточные данные. Вы захотите опубликовать обработанный массив, перебирая строки.

$groupedArray = array();
foreach ($result as $item)
{
   if(!isset($groupedArray[$item['event_id']])
   {
       // Create an empty array if we don't have one for this grouping yet.
       $groupedArray[$item['event_id']] = array();
   }

   // Append the current item to the subarray.    
   $groupedArray[$item['event_id']][] = $item;

}

Этот вид цикла на самом деле довольно идиоматичен. Возможно, вы захотите написать / найти общую функцию «перегруппировать».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...