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

标签 php mysql one-to-many

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

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

每个SCHEDULE都有许多OVERRIDES,每个覆盖都有许多LOCATIONS。我想检索这些数据,以便它可以全部显示在单个 PHP 页面上,例如列出我的时间表。在每个计划中列出“覆盖”,并在每个覆盖中列出“位置”。

选项1 - 最好的方法是进行 3 个单独的 SQL 查询,然后将它们写入 PHP 对象吗?然后我可以迭代每个数组并检查父数组上的匹配项。

选项 2 - 我对联接思考了很多,但是执行两次右联接将为所有 3 个表中的每个入口返回一行。

如有任何想法和评论,我们将不胜感激。

最诚挚的问候,本。

最佳答案

如果您确实想要每条数据,则无论您如何操作,都将检索相同数量的行。最好在一次查询中获取所有内容。

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

通过像这样对结果进行排序,您可以迭代结果集,并在 Scheduleid 更改时转到下一个计划,并在 locationid 更改时转到下一个位置。

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

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

相当原始,我想你的代码看起来会有所不同,但希望它有意义。

关于PHP 和 MySQL - 高效处理多个一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4820742/

相关文章:

javascript - 使用回调将 PHP 变量传递给 JavaScript

php - 从 mysql 选择表时编码错误

mysql - Flash 文本旋转器 xml

python - 无法删除一对多关系中的父记录 - Flask-SqlAlchemy

loops - 查询中的 SPARQL 'for-loop'

javascript - 简单的ajax调用,没有语法错误。还是行不通

php - 触发 HTTP 错误 : 4xx 5xx via HTML/PHP

mysql - 不使用外键的 JOIN 读取性能与使用外键的连接的比较

mysql - 加入按日期排序的 MYSQL 中的两个不同列表?

java - JPA - @OneToMany 作为 map