【问题标题】:How to display group data based on end date?如何根据结束日期显示组数据?
【发布时间】:2020-11-28 08:37:54
【问题描述】:

我有一张如下表:

如何使用新表显示基于任务结束日期的数据。这意味着,完整的

                                        **Staff 1**

日期:2020-11-14

日期:2020-11-27

                                         **Staff 2**

日期:2020-11-14

在期待中感谢。

<div>
<table class="table table-bordered">
<tr>
<th>ID</th>
<th>Task Name</th>
<th>Remarks</th>
<th>Start Date</th>
<th>End Date</th>
</tr>
<?php
$sql = "SELECT * FROM dl_fullremarks ";
$result = mysqli_query($conn, $sql);
foreach ($result as $row) {?>
<tr>
<td><?php echo $row['staff_id']; ?></td>
<td><?php echo $row['task_name']; ?></td>
<td><?php echo $row['task_remarks']; ?></td>
<td><?php echo $row['task_startdate']; ?></td>
<td><?php echo $row['task_enddate']; ?></td>
</tr>
    <?php
}
?>
</table>
</div>

【问题讨论】:

  • 这取决于您想在哪里进行排序,从您的查询、后端还是前端?
  • @AngeLOL 感谢您的积极回应。您附上了我可以尝试的任何方法并让您知道反馈。
  • 这是更改查询的问题。其他一切都保持不变。如果您的 end_date 列的数据类型为 datetime,那么像 "SELECT * FROM table_name WHERE end_date = $end_date" 这样的简单查询就可以了。如果您想要某种形式的排序,那么您可以在查询末尾添加ORDER BY column_name ASC|DESC

标签: javascript php


【解决方案1】:

您可以先使用 SQL 获取数据,然后使用 PHP 关联数组对其进行组织:

$data = [];
foreach ($result as $row) {
    // Check if the current end date is part of the array. If not, add it
    if (!isset($data[$row['task_enddate']]) {
        $data[$row['task_enddate']] = [];
    }
    // Add the row to the assigned end date
    $data[$row['task_enddate']][] = $row;
}

$data nows 包含以下结构:

[
    '2020-11-14' => [
        ['staff_id' => 1, 'task_name' => 'name', // ...],
        ['staff_id' => 2, 'task_name' => 'other name', // ...],
    ],
    '2020-12-16' => [
        ['staff_id' => 3, 'task_name' => 'name', // ...],
    ],
]

您现在可以循环显示您的模板:)!

foreach ($data as $date => $rows) {
    echo '<div>';
    echo "<div>$date</div>";
    echo '<div class="row">';
    foreach ($rows as $row) {
        // Display your row data here
    }
    echo '</div></div>';
}

【讨论】:

  • 似乎您的提示工作正常,但我遇到了嵌套循环问题。您能帮我通过 $data 添加循环以显示我的模板吗?
  • 我用一个快速循环示例编辑了我的通讯 :)。你必须做一个嵌套循环。
【解决方案2】:

task_endtime的分组结果集:

SELECT * FROM dl_fullremarks
WHERE staff_id = '1'
ORDER BY task_endtime

task_endtime 从上次保存时更改,然后打印标题。所有其他行都按照您的示例打印。

$prev_endtime = null
foreach ($result in $rows) {
  if (date('Y-m-d', $row['taks_endtime']) != $prev_endtime) {
    echo '<div class="header">date formatted here</div>';
    $prev_endtime = date('Y-m-d', $row['task_endtime']);
  }
  echo '<div class="row">row cells gere</div>';
}

【讨论】:

  • 我尝试了你的提示,但它只显示每个结束日期的 1 条记录......那么如何解决这个问题呢?
  • Hm.. 请检查结果是否包含正确的数据。我们希望看到按task_endtime 分组的所有记录(例如在phpMyAdmin 中)。哦.. 看来我在我的代码中发现了一个错误。我比较日期和时间,但我们只需要比较日期部分。在答案中添加修改。
  • 我认为“group by”子句选择所有记录并按结束日期分组,只显示该组中的第一条记录,而不是根据组显示所有记录
  • @Luco,即便如此,我也没有使用聚合函数,所以每条记录都是一个组,因此它们应该按task_endtime 排序。但是让我们将GROUP BY 替换为ORDER BY。尝试调试foreach。它应该可以工作,因为算法很简单。 header 行仅在与前一行不同时打印。所有其他行都按照您的示例打印。
猜你喜欢
  • 2012-07-14
  • 1970-01-01
  • 2021-04-10
  • 2020-10-08
  • 1970-01-01
  • 2021-07-14
  • 1970-01-01
  • 2016-03-20
  • 2020-11-20
相关资源
最近更新 更多