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

时间:2016-12-21 13:10:35

标签: 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 -- 
    LIST #2
 -- row inside list #2 --
    LIST #1
 -- row inside list #1 --

以下是视觉效果:

Problem visualized

这是我在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>";
        }

我做错了什么?

2 个答案:

答案 0 :(得分:8)

幸运的是,您正在使用已经具有此功能的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";
     }
}

答案 1 :(得分:0)

如果您运行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_idlist_id的意思。

我应该注意到list_id中有SELECT出现两次,因为它出现在两个表格中。您可能应该从两个表中明确列出所需的列,并避免使用冗余列。