通常,我的明显答案是“几次加入”。但情况如下: 我有一个有几千个条目的表,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(主键) job(与作业中的行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-&gt; 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);
答案 0 :(得分:1)
您有两种*查询数据库的方法:
* 不要分别加载所有三个表,然后尝试在php中链接它们
首先加载第一种方法可能需要更长的时间,但是当加载数据时,将不再有数据库调用。另一方面,尽管将数据显示为表(具有重复的主表)可能很容易,但通常不是所需的UI。除非您使用特殊的UI组件来自动处理主细节,否则将表转换为更合理的形式(在本例中为循环)可能会有一些困难。
您的问题实际上是一个UI设计问题,如何显示两个级别的主细节。有许多UI模式可以显示主要细节。
例如,您只能在下拉列表中加载第一级(表A)并查询数据库并在下拉更改时显示第二级。或者你可以有一个类似于树的结构,在崩溃时查询数据库。
看看this link,了解一下。您还可以尝试为php搜索master-detail UI组件。