通常,对我来说最明显的答案是“几个加入”。但是情况是这样的:我有一个有几千条条目的表,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数组和循环。它会变得很混乱,所以我想知道我是应该使用三个单独的查询来消除所有嵌套的PHP循环,还是应该继续使用联接?
附加信息: "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;
        }
    }
}我在函数中使用以下代码获得"work“数组(其中$query->result()是long 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);发布于 2013-04-25 02:23:54
您有两种查询DB的方法:
*不要分别加载所有三个表,然后尝试将它们链接到php中。
第一种方法一开始可能需要更长的时间来加载,但是当数据被加载时,就不会有更多的DB调用了。另一方面,虽然可以很容易地将数据显示为一个表(带有重复的母版),但这通常不是所需的UI。除非您使用一个特殊的UI组件来自动处理主细节,否则您可能很难将表转换为更合理的形式(在本例中是循环)。
您的问题实际上是一个UI设计问题,因为如何显示两个级别的主细节。有许多UI模式可以显示主细节。
例如,您只能在下拉列表中加载第一个级别(表A)并查询DB,并在下拉更改中显示第二个级别。或者,您可以使用类似树的结构,在崩溃时查询数据库。
看看此链接,了解一些想法。您还可以尝试搜索php的主细节UI组件。
https://stackoverflow.com/questions/16204809
复制相似问题