【问题标题】:Multiple MySQL queries or one with several JOINs?多个 MySQL 查询或一个具有多个 JOIN 的查询?
【发布时间】:2023-03-17 14:49:01
【问题描述】:

通常对我来说显而易见的答案是“几个连接”。但情况是这样的: 我有一个包含几千个条目的表,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?

其他信息: “表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;
        }
    }
}

我在函数中使用此代码获得“工作”数组(其中 $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);

【问题讨论】:

  • 您应该使用子查询来解决问题....发布您的表结构和所需的输出
  • 也展示一些“循环”的例子。可能有一些可以清理的东西。数以万计的条目并不是很多条目。如今,大多数处理器每秒执行数十亿个周期。
  • 你试过SELECT a.*, b.*, c.* FROM tableA a JOIN tableB b ON (a.id = b.idA) JOIN tableC c ON (b.id = c.idB) WHERE a.id = ?
  • @ExplosionPills 我应该补充一点,tableB 中可能有 0 行与 tableA 一起使用,tableC 中可能有 0 行与 tableB 一起使用
  • @DrAgonmoray 尝试在我的查询中将JOIN 更改为LEFT JOIN

标签: php mysql loops join


【解决方案1】:

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

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

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

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

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

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

看看this link,了解一下。您还可以尝试搜索 php 的主从 UI 组件。

【讨论】:

  • 感谢您解释我的选择以及文章。我还不确定我要做什么,但这可以解决问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-07
  • 2015-01-19
  • 1970-01-01
  • 2012-05-23
  • 1970-01-01
相关资源
最近更新 更多