Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 列出按类别名称分组的记录_Php_Mysql_Join_Pdo - Fatal编程技术网

Php 列出按类别名称分组的记录

Php 列出按类别名称分组的记录,php,mysql,join,pdo,Php,Mysql,Join,Pdo,我遇到一些问题,试图从我的数据库中获取数据,并正确显示它。我有一个布局,其中有两个列表,我可以在每个列表中添加行。我可以在每个列表中添加多行 我想显示输出,所以首先显示第一个列表及其所有行,然后显示第二个列表及其行 目前的情况是这样的: LIST #1 -- row inside list #1 -- -- row inside list #1 -- LIST #2 -- row inside list #2 -- LIST #1 -- row inside

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

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

目前的情况是这样的:

    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 --
目前,它显示如下:

    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>";
        }

我做错了什么?

如果运行SQL查询,并且希望结果按特定顺序排列,则始终包含ORDERBY子句

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

$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就是你所说的列表id


我应该注意,您的列表id在SELECT中出现了两次,因为它在两个表中。您可能应该明确列出两个表中所需的列,并避免冗余列。

幸运的是,您使用的是PDO,它已经为您提供了此功能,可以完全按照您的要求进行操作—根据某个列对数据进行分组

,基于选定的第一个字段。因此,您需要将列表id列为字段列表中的第一个字段,然后使用前面提到的fetchAll获取模式获取行:

foreach ($driving as $list_id => $list_data)
{
     echo $list_data[0]['list_name']."<br />\n"; 
     foreach ($list_data as $row)
     {
         echo "whatever";
     }
}
现在您得到了一个整洁的嵌套数组,其中的行按列表id分组

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


这将正确排序列表,但不会合并列表中的所有行。现在,它在列表中为每一行显示一个列表。我想合并每个列表中的列表行。您应该在应用程序级别进行合并。我不太确定您在“选择”窗口中两次看到列表id的位置?我只看到列表id和id@oliverbj . . . 这是在驱动列表出货,以及。这是相当甜蜜的!工作起来很有魅力。但是,只是一个关于双嵌套foreach语句的问题—这会如何影响性能?只是一个后续问题—如何在第一个foreach语句中使用表中的数据?例如,如何在第一个foreach语句中打印dl.list\u name值?是的,当然。始终至少有一行,因此您可以像$list\U data[0]['list\U name'一样安全地对其进行寻址