gpt4 book ai didi

php - 多个 MySQL 查询还是一个具有多个 JOIN 的查询?

转载 作者:行者123 更新时间:2023-11-29 13:53:56 24 4
gpt4 key购买 nike

通常对我来说显而易见的答案是“多次连接”。但情况是这样的:我有一个包含几千个条目的表,tableA。我有另一个包含数千个条目的表,tableB。每个条目都有一个与 tableA 中的行 id 相关的数字。表 B 中的多行与表 A 中的单行相匹配。将有第三个表 tableC,其中包含数万个条目。它将有多行对应于 tableB 中的一行。

查询可能看起来像这样:(具体细节并不重要)

SELECT tableA.*, tableB.*, tableC.* LEFT JOIN tableB ON tableB.idA = tableA.id LEFT JOIN tableC ON tableC.idB = tableB.id WHERE tableA.id = some_number;

这工作得很好,但由于加入,我得到了大量的重复行。我想要表 A 的一个结果、表 B 的一些结果以及表 C 的一些结果。

不幸的是,为了做到这一点,我使用了许多嵌套的 PHP 数组和 for 循环。它变得很困惑,所以我想知道我是否应该使用 3 个单独的查询来摆脱所有嵌套的 PHP 循环,或者我是否应该坚持使用 JOINS?

其他信息:“表A”:职位id(主键)姓名描述日期小时顾客状态

“tableB”:工作id(主键)作业(与作业中行的 id 相关)概括描述日期

“tableC”:次数id(主键)工作(与工作中的行 ID 相关)开始结束

期望的输出:我不太确定哪种格式最好。我想要一个作业行,以及与之相关的工作列表,以及每项工作相关的时间列表。

嵌套循环示例:$work 是一个有两个值的数组。第一个是作品数组,第二个是时间数组。

foreach ($work[0] as $workk=>$workv) {
echo("<div><h1>" . $workk . ": " . $workv["summary"] . "</h1><br/>Job: " . $workv["job"] . "</br>Date: " . $workv["date"] . "<br>Description:" . $workv["description"] . "<br/>Times:<br/>");
foreach ($work[1] as $workid=>$times) {
if ($workid == $workk) {
foreach ($times as $time) {
echo("Start: " . $time[0] . " | End: " . $time[1]);
}
break;
}
}
}

我在函数中使用此代码获取“work”数组(其中 $query->result() 是长 JOIN 查询中的一行)

foreach ($query->result() as $row) {
if (!array_key_exists($row->id, $work)) {
$work[$row->id] = array("job"=>$row->job, "summary"=>$row->summary, "description"=>$row->description, "date"=>$row->date);
}
$times[$row->id][] = array($row->start, $row->end);
}
return array($work, $times);

最佳答案

您有两种*方式查询数据库:

  1. 通过两个左连接获取所有数据。
  2. 获取主数据并按需加载详细信息。

*不要分别加载所有三个表,然后尝试在 php 中链接它们

第一种方法一开始可能需要更长的时间来加载,但随着数据加载,将不再有数据库调用。另一方面,虽然将数据显示为表格(具有重复的主数据)可能很容易,但这通常不是所需的 UI。除非您使用特殊的 UI 组件来自动处理主详细信息,否则将表转换为更合理的形式(在本例中为循环)可能会遇到一些困难。

您的问题实际上是一个 UI 设计问题,即如何显示两个级别的主细节。有许多 UI 模式可以显示主细节。

例如,您只能加载下拉列表中的第一级(表 A)并查询数据库并在下拉列表更改时显示第二级。或者您可以有一个类似树的结构,在崩溃时查询数据库。

看看this link ,以获得一些想法。您还可以尝试搜索 php 的主从 UI 组件。

关于php - 多个 MySQL 查询还是一个具有多个 JOIN 的查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16204809/

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