PHP和MySQL - 有效地处理多个一对多关系

Ben*_*Ben 2 php mysql one-to-many

我正在寻找一些关于使用MySQL和PHP检索和显示数据的最佳方法的建议.

我有3个表,所有1对多关系如下:

每个SCHEDULE都有许多OVERRIDES,每个覆盖有很多LOCATIONS.我想检索这些数据,以便它可以显示在一个PHP页面上,例如列出我的SCHEDULES.在每个计划列表中列出OVERRIDES,并在每个覆盖列表中列出LOCATIONS.

选项1 - 执行此操作的最佳方法是创建3个单独的SQL查询,然后将这些查询写入PHP对象吗?然后,我可以遍历每个数组并检查父数组上的匹配项.

选项2 - 我已经考虑了很多关于连接但是做两个正确的连接将为我的所有3个表中的每个入口返回一行.

任何想法和意见将不胜感激.

此致,本.

Teh*_*ike 5

如果您真的想要每一段数据,那么无论您如何操作,您都将检索相同数量的行.最好在一个查询中获取所有内容.

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
Run Code Online (Sandbox Code Playgroud)

通过这样排序结果,您可以遍历结果集,并在scheduleid更改时继续执行下一个计划,并在locationid更改时继续下一个位置.

编辑:如何将此数据转换为三维数组的可能示例 -

$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;
}
Run Code Online (Sandbox Code Playgroud)

非常原始,我想你的代码看起来会有所不同,但希望它有一定道理.