【问题标题】:List records grouped by category name列出按类别名称分组的记录
【发布时间】:2017-05-06 22:09:49
【问题描述】:

我遇到了一些问题,试图从我的数据库中获取数据并正确显示。我有一个布局,其中有两个“列表”,我可以在其中向每个列表添加行。我可以向每个列表添加多行。

我想显示输出,所以首先显示第一个列表及其所有行,然后显示第二个列表及其行。

目前显示如下:

    LIST #1
 -- row inside list #1 -- 
 -- row inside list #1 --

    LIST #2
 -- row inside list #2 --

目前显示如下:

    LIST #1
 -- row inside list #1 -- 
    LIST #2
 -- row inside list #2 --
    LIST #1
 -- row inside list #1 --

以下是视觉效果:

这是我在 PHP 中的选择:

    $driving=$dbh->prepare("SELECT 
    driving_lists.id,
    driving_lists.list_id,
    driving_lists.date,
    driving_lists.list_name,
    driving_list_shipments.*
FROM
    driving_lists
        LEFT JOIN driving_list_shipments ON driving_lists.list_id = driving_list_shipments.list_id

    ");
    $driving->execute();

还有输出脚本:

foreach( $driving as $row){
                echo "<pre>";
                echo $row["list_name"];
                echo "<br />";
                echo $row["reference"];
                echo "</pre>";
        }

我做错了什么?

【问题讨论】:

    标签: php mysql join pdo


    【解决方案1】:

    如果您运行 SQL 查询并希望结果按特定顺序排列,则总是包含order by 子句。

    在你的情况下,你似乎想要:

    SELECT dl.id, dl.list_id, dl.date, dl.list_name,
           dls.*
    FROM driving_lists dl LEFT JOIN
         driving_list_shipments dls
         ON dl.list_id = dls.list_id
    ORDER BY dl.list_id;
    

    我假设list_id 就是您所说的list_id

    我应该注意到list_idSELECT 中出现了两次,因为它在两个表中。您可能应该从两个表中显式列出您想要的列,并避免冗余列。

    【讨论】:

    • 这对列表进行了正确排序,但是它并没有合并列表中的所有行。现在,它在该列表中为每一行显示一个 LIST #。我想在每个列表中合并列表行。
    • 您应该在应用程序级别进行“合并”。
    • 我不太确定你在哪里看到 list_id 两次?我只看到“list_id”和“id”
    • @oliverbj 。 . .它也在driving_list_shipments 中。
    【解决方案2】:

    幸运的是,您使用的 PDO 已经为您提供了此功能,可以完全按照您的意愿行事 - 根据某些列对数据进行分组。

    PDO can group results into the nested arrays,基于选择的第一个字段。因此,您需要将您的列表 id 列为字段列表中的第一个字段,然后使用 fetchAll() 和上述提取模式获取您的行:

    $sql = "SELECT dl.list_id, dl.id, dl.date, dl.list_name, dls.*
      FROM driving_lists dl LEFT JOIN
         driving_list_shipments dls
     ON dl.list_id = dls.list_id
     ORDER BY dl.list_id";
    
    $driving = $dbh->query($sql)->fetchAll(PDO::FETCH_GROUP);
    

    现在你得到了一个整洁的嵌套数组,其中你的行按列表 id 分组!

    要使其输出整齐,您必须使用两个嵌套的 foreach 运算符

    foreach ($driving as $list_id => $list_data)
    {
         echo $list_data[0]['list_name']."<br />\n"; 
         foreach ($list_data as $row)
         {
             echo "whatever";
         }
    }
    

    【讨论】:

    • 这很甜蜜!奇迹般有效。但是,只是关于双嵌套 foreach 语句的问题 - 这对性能有何影响?
    • 只是一个后续问题 - 如何在第一个 foreach 语句中使用表中的数据?例如,如何在第一个 foreach 语句中打印 dl.list_name 值?
    • 是的,当然。总是至少有一行,因此您可以安全地解决它,例如$list_data[0]['list_name']
    猜你喜欢
    • 1970-01-01
    • 2018-01-04
    • 1970-01-01
    • 2019-10-26
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多