通常对我来说显而易见的答案是“几个连接”。但情况是这样的:我有一个包含几千个条目的表,tableA。我有另一个包含数千个条目的表,tableB。每个条目都有一个与 tableA 中行的 id 相关的数字。tableB 中将有多行与 tableA 中的单行一起使用。将有第三个表 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;
这工作得很好而且很花哨,但是由于加入,我得到了大量的重复行。我想要 tableA 的一个结果,tableB 的一些结果和 tableC 的几个结果。
不幸的是,为此我使用了许多嵌套的 PHP 数组和 for 循环。它变得很乱,所以我想知道我是否应该只使用 3 个单独的查询来摆脱所有嵌套的 PHP 循环,还是应该坚持使用 JOINS?
附加信息: “tableA”:工作 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;
}
}
}
我在函数中使用此代码获取“工作”数组(其中 $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);