4

这是一个示例表:

info table
info_id     name  
1           john  
2           peter
------------------------  
details table  
details_id      log                               date  
1            test log for john                  2013-08-01  
1            another log for john               2013-08-02  
2            test log for peter                 2013-08-02

这是我的示例查询:

SELECT info.info_id, info.name, details.details_no, details.log, details.date 
FROM info JOIN details ON details.details_id = info.info_id 
GROUP BY info.info_id  

这是我想要实现的显示:

john  
1     test log for john            2013-08-01  
1     another test log for john    2013-08-02  

peter  
2     test log for peter           213-08-02  

我尝试使用 foreach 循环,然后在第一个循环中执行另一个 foreach 循环。

请帮助伙计们

4

5 回答 5

11

尝试将您的结果变成如下所示的多维数组

注意:我假设这details.details_nodetails表的主键,并且您希望结果类似于

john  
1     test log for john            2013-08-01  
2     another test log for john    2013-08-02  

peter  
3     test log for peter           213-08-02

您可以使用以下内容检索

...
$qry = "
    SELECT
        info.info_id,
        info.name,
        details.details_no,
        details.log,
        details.date 
    FROM
        info
        JOIN details ON (details.details_id = info.info_id)
";
$result = mysqli_query($your_db_link,$qry)
$data = array();
while($row = mysqli_fetch_array($result)){
    $data[$row["info_id"]]["name"] = $row["name"];
    $data[$row["info_id"]]["logs"][$row["details_no"]] = array(
        "log"=>$row["log"],
        "date"=>$row["date"],
    );
}

会产生一个数组,如:

$data = array(
    "1" => array(
        "name" => "john",
        "logs" => array(
            "1" => array(
                "log" => "test log for john",
                "date" => "2013-08-01",
            ),
            "2" => array(
                "log" => "another test log for john",
                "date" => "2013-08-02",
            ),
        ),
    ),
    "2" => array(
        "name" => "peter",
        "logs" => array(
            "3" => array(
                "log" => "test log for peter",
                "date" => "2013-08-02",
            ),
        ),
    ),
);

然后你可以显示如下:

echo "<table>";
foreach($data as $value){
    echo "<tr><td colspan='3'>".$value["name"]."</td></tr>";
    foreach($value["logs"] as $subkey => $subvalue){
        echo "<tr>";
        echo "<td>".$subkey."</td>";
        echo "<td>".$subvalue["log"]."</td>";
        echo "<td>".$subvalue["date"]."</td>";
        echo "</tr>";
    }
}
echo "</table>";

结果类似于:

<table>
    <tr>
        <td colspan='3'>john</td>
    </tr>
    <tr>
        <td>1</td>
        <td>test log for john</td>
        <td>2013-08-01</td>
    </tr>
    <tr>
        <td>2</td>
        <td>another test log for john</td>
        <td>2013-08-02</td>
    </tr>
    <tr>
        <td colspan='3'>peter</td>
    </tr>
    <tr>
        <td>3</td>
        <td>test log for peter</td>
        <td>2013-08-02</td>
    </tr>
</table>
于 2013-07-31T20:53:30.320 回答
4

您可能必须获取数据并制作您想要的数组。

$data = array();
foreach ($result as $item) {
    $key = $item['name']; // or $item['info_id']
    if (!isset($data[$key])) {
        $data[$key] = array();
    }

    $data[$key][] = $item;
}

// Build your table with the new $data array

编辑

这只是一个例子。正如 amaster507 指出的那样,如果您的name字段不是唯一的,您将需要在唯一键上构建您的数组。与此没有太大不同,因为您可能只需更改$item['name']to的实例$item['info_id']

于 2013-07-31T20:17:41.420 回答
0

好的,首先解释问题。

当您使用 时GROUP BY,您不再将每个结果都作为一行获得,而是将获得 1 行的分组内容,也就是说,您可以使用johnGROUP BY来获得两个单元格的串联等内容。log

要执行您想要的操作,请删除GROUP BY以获取所有行,然后手动处理它们。

我建议你简化这项工作,使用underscore.php,它有一个函数调用groupBy,它将返回一个分组在子数组中的数组,基于这种情况,info_id列。

它将像这样使用:

$array_with_all_the_rows = $query->fetchAll(); // Or whatever you use to get all rows in 1 array.
$grouped_array = __::groupBy($array_with_all_the_rows, 'info_id');

该分组数组将如下所示:

$grouped_array = Array( 
    "1" => Array(
        "info_id"=> "1", "log"=>"test log for john", "date" => "2013-08-01",
        "info_id"=> "1", "log"=>"another test log for john", "date" => "2013-08-02"
    ), 
    "2" => Array(
        "info_id"=> "2", "log"=>"test log for peter", "date" => "2013-08-02"
    )
)
于 2013-07-31T20:23:48.187 回答
0

为了完善 Ascherer 的答案,您不需要在使用[]语法将数据推送到数组之前声明数组。如果您使用array_push()的是数组,则需要首先将其声明为变量。

使用 MySQLi,您可以直接使用 a 迭代结果集对象,foreach()并无条件地将info_id值用作分组依据。

$sql = "SELECT info.info_id,
               info.name,
               details.log,
               details.date
        FROM info
        JOIN details ON details.details_id = info.info_id
        ORDER BY info.info_id";

$result = [];
foreach ($mysqli->query($sql) as $row) {
    $data[$row['info_id']][] = $row;
}

使用 PDO,您可以使用->fetchAll(PDO::FETCH_GROUP)创建相同的输出,而无需手动循环。

生成 html 标记时...

<table>
    <?php foreach ($result as $groupId => $rows) { ?>
        <tr>
            <td colspan='3'><?php echo $rows[0]["name"]; ?></td>
        </tr>
        <?php foreach($rows as $row) { ?>
            <tr>
                <td><?php echo $groupId; ?></td>
                <td><?php echo $row['log']; ?></td>
                <td><?php echo $row['date']; ?></td>
            </tr>
        <?php } ?>
    <?php } ?>
</table>
于 2020-12-05T15:58:26.920 回答
-1

您是否尝试过带有键/值对的 foreach?你能告诉我们你目前的for循环吗?结果数组的 print_r/var_dump 将使某人更容易帮助您。

foreach ($result as $key=>$value) {
  print "Name Row\n";
  for (each display row) {

那或 Ascherer 建议创建一个新的多维数组,这将使嵌套的 for 循环变得不必要。

于 2013-07-31T20:20:58.063 回答