PHP и MySQL - эффективно обрабатывает несколько отношений один ко многим - PullRequest
2 голосов
/ 27 января 2011

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

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

Каждый РАСПИСАНИЕ имеет множество ПЕРЕЗАГРУЗКИ , а каждое переопределение имеет множество LOCATIONS . Я хотел бы получить эти данные, чтобы они могли отображаться на одной странице PHP, например перечислите мои ГРАФИКЫ. В каждом списке расписаний ПЕРЕЗАГРУЗКИ, а в каждом списке переопределений ЛОКАЦИИ.

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

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

Любые мысли и комментарии приветствуются.

С наилучшими пожеланиями, Бен.

1 Ответ

5 голосов
/ 27 января 2011

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

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;
}

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

...