PHP и MySQL - эффективная обработка нескольких отношений "один ко многим"

Мне нужен совет о том, как лучше всего получить и отобразить мои данные с помощью MySQL и PHP.

У меня есть 3 таблицы, все отношения от 1 до многих следующим образом:

У каждого РАСПИСАНИЯ есть много ОТМЕНЕНИЙ, и у каждого изменения есть много МЕСТОПОЛОЖЕНИЙ. Я хотел бы получить эти данные, чтобы все они могли отображаться на одной странице PHP, например. перечислите мои РАСПИСАНИЯ. В каждом расписании перечислите ПЕРЕПИСКИ, а в каждом переопределении перечислите МЕСТА.

Вариант 1. Лучше всего сделать 3 отдельных SQL-запроса, а затем записать их в объект PHP? Затем я мог бы перебрать каждый массив и проверить совпадение с родительским массивом.

Вариант 2. Я много думал о соединениях, однако выполнение двух правильных соединений вернет мне строку для каждого входа во всех трех таблицах.

Любые мысли и комментарии будут оценены.

С уважением, Бен.


person Ben    schedule 27.01.2011    source источник


Ответы (1)


Если вам действительно нужен каждый фрагмент данных, вы будете извлекать одинаковое количество строк, независимо от того, как вы это делаете. Лучше всего получить все это в одном запросе.

SELECT schedule.id, overrides.id, locations.id, locations.name
FROM schedule
JOIN overrides ON overrides.schedule_id = schedule.id
JOIN locations ON locations.override_id = overrides.id
ORDER BY schedule.id, overrides.id, locations.id

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

Изменить: возможный пример того, как превратить эти данные в трехмерный массив -

$last_schedule = 0;
$last_override = 0;
$schedules = array();

while ($row = mysql_fetch_array($query_result))
{
  $schedule_id = $row[0];
  $override_id = $row[1];
  $location_id = $row[2];
  $location_name = $row[3];
  if ($schedule_id != $last_schedule)
  {
    $schedules[$schedule_id] = array();
  }
  if ($override_id != $last_override)
  {
    $schedules[$schedule_id][$override_id] = array();
  }
  $schedules[$schedule_id][$override_id][$location_id] = $location_name;
  $last_schedule = $schedule_id;
  $last_override = $override_id;
}

Довольно примитивно, я думаю, ваш код будет выглядеть иначе, но, надеюсь, в этом есть смысл.

person TehShrike    schedule 27.01.2011
comment
да, хороший момент, одинаковое количество строк будет возвращено в любом случае. Что касается отображения, мне просто нужно отобразить каждое расписание как часть страницы, и в каждом расписании мне нужно перечислить каждое переопределение с его местоположением. Должно быть нормально работать с массивом. Меня интересует ваш комментарий о переходе к следующему расписанию при изменении идентификатора расписания. Вы можете посоветовать? Заранее большое спасибо, я продолжу с одним запросом к БД. С уважением, Бен. - person Ben; 27.01.2011
comment
Я добавил пример кода, который, надеюсь, укажет вам полезное направление. - person TehShrike; 27.01.2011