gpt4 book ai didi

php - 优化 MySQL 和 PHP 中的多个查询

转载 作者:搜寻专家 更新时间:2023-10-30 22:14:57 25 4
gpt4 key购买 nike

问题

  1. 我应该如何进行查询才能获得此结果?

  2. 我应该为数据库表使用不同的结构吗?

详情

我想从 3 个表中获取结果:

+------------------------------+-------------------+
| courses | id | <-------+
| | name | |
| | | |
+------------------------------+-------------------+ |
| sections | id | <-------|----------+
| | course_id | <- FK(courses.id) |
| | name | |
+------------------------------+-------------------| |
| resources | id | |
| | section_id | <- FK(sections.id)-+
| | name |
+------------------------------+-------------------+

我想像这样将结果存储在 PHP 数组中:

Array
(
[courses] => Array
(
[id] => 1
[name] => course 1
[sections] => Array
(
[0] => Array
(
[id] => 1
[course_id] => 1
[name] => course 1 section 1
[resources] => Array
(
[0] => Array
(
[id] => 1
[section_id] => 1
[name] => resource 1
)

)

)

)

)

)

编辑

我做了什么:

$cources = DB::query(Database::SELECT,
'select * from courses')->execute($db,false)[0]; // Get all courses as array

foreach($courses as &$course) {
$sections = DB::query(Database::SELECT,
'select * from sections where course_id = '.$courses['id']);

$course['sections'] = $sections;

foreach($course['sections'] as &&section) {
$resources = DB::query(...); // Get array of resources
$section['resources'] = $resources;
}
}

最佳答案

数据库结构已规范化 - 这是正确的,不应更改。

但是,SQL 为 N+ 连接返回非规范化或“扁平化”数据:在单个结果集中只能返回一组同质记录。 (一些数据库,如 SQL Server,允许通过支持 XML 生成来返回结构。)

要在 PHP 中获得所需的数组结构,需要:

  1. 单独的查询/结果集(如帖子中所示):ick!

    大约会有一个查询/对象。虽然理论界限可能 相似,但实际实现效率会低得多,而且开销会比单个查询多得多。请记住,每个 查询都会(至少)产生往返惩罚 - 因此,这是不可扩展的,尽管它可能适用于较小的数据集或用于“对时间不敏感”的操作。

  2. 重新归一化结果结构:

    这对于 C#/LINQ 中的“Group By”操作的支持来说是非常微不足道的。我不确定在 PHP1 中如何 [轻松] 解决这个问题。这也不是完美的,但假设散列用于分组,这应该能够很好地扩展 - 它肯定会比 #1 更好。

如果可能的话,考虑以可以在当前问题/范围内使用“平坦”结果的方式编写查询,而不是上述方式。也就是说,分析数组将如何使用 - 然后围绕该问题编写查询。这通常是一种更好的方法,可以很好地扩展


1 与重新归一化数据有关,YMMV:

关于php - 优化 MySQL 和 PHP 中的多个查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15180239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com