如何将PHP+MySQL查询结果按日期分组并分页展示?
实现按日期分组展示用户数据的修改方案
嘿,我来帮你搞定按日期分组展示用户数据的需求!咱们一步步调整你的PHP代码,同时保留分页功能:
核心思路
要实现按日期分组,关键是先按日期排序(你原代码已经做了ORDER BY date DESC,这点很棒),然后在循环输出时,判断当前行的日期是否和上一行一致——如果不一致,就输出新的日期标题,再展示该行数据。另外要注意:如果你的date字段包含时间(比如YYYY-MM-DD HH:MM:SS),得先提取纯日期部分,避免同一日期但不同时间的记录被当成不同分组。
修改后的完整代码
<?php // 数据库连接 $con = mysqli_connect("localhost","root","","sample") or die(mysqli_connect_error()); // 分页配置 $result_per_page = 10; $current_page = isset($_GET['page']) ? (int)$_GET['page'] : 1; // 获取当前页码,默认第1页 $offset = ($current_page - 1) * $result_per_page; // 计算分页偏移量 // 查询总条数(用于计算总页数) $calculation_data_query = "SELECT COUNT(*) AS total FROM `users`"; $run_calculation = mysqli_query($con, $calculation_data_query); $total_rows = mysqli_fetch_assoc($run_calculation)['total']; $number_of_pages = ceil($total_rows / $result_per_page); // 查询当前页数据,同时提取纯日期字段 $table_data_query = mysqli_query($con, "SELECT *, DATE(date) AS formatted_date FROM `users` ORDER BY date DESC LIMIT $offset, $result_per_page"); // 初始化变量存储上一个日期 $previous_date = ''; ?> <!-- 输出分组数据 --> <?php while($row_value = mysqli_fetch_array($table_data_query)): ?> <?php $current_date = $row_value['formatted_date']; // 如果当前日期和上一个不同,输出日期标题 if($current_date !== $previous_date): // 格式化日期为你要的DD/MM/YYYY格式 $display_date = date("d/m/Y", strtotime($current_date)); ?> <h3><?php echo $display_date; ?></h3> <table> <tr> <th>ID</th> <th>Name</th> <th>Email</th> <th>Phone</th> </tr> <?php $previous_date = $current_date; endif; ?> <tr> <td><?php echo $row_value['id']; ?></td> <td><?php echo $row_value['name']; ?></td> <td><?php echo $row_value['email']; ?></td> <td><?php echo $row_value['phone']; ?></td> </tr> <?php endwhile; ?> </table> <!-- 分页导航(可选,完善分页功能) --> <div class="pagination"> <?php for($i=1; $i<=$number_of_pages; $i++): ?> <a href="?page=<?php echo $i; ?>" <?php echo $i == $current_page ? 'class="active"' : ''; ?>><?php echo $i; ?></a> <?php endfor; ?> </div> <?php mysqli_close($con); ?>
关键改动说明
- 日期格式化处理:用
DATE(date) AS formatted_date提取纯日期,避免时间部分干扰分组;再用date("d/m/Y", strtotime($current_date))转换成你需要的DD/MM/YYYY格式。 - 分组判断逻辑:新增
$previous_date变量,每次循环对比当前日期和上一个日期,不同时就输出日期标题和表格表头。 - 完善分页逻辑:把原来固定的
LIMIT 0,10改成动态偏移量,支持多页切换;同时优化总条数查询,用COUNT(*)比查所有数据更高效。 - 代码结构优化:用
while(:)和endwhile的语法让HTML和PHP混合代码更易读,同时新增了表头和分页导航(如果不需要可以删掉分页部分)。
注意哦:如果你的date字段已经是纯日期类型(比如YYYY-MM-DD),可以去掉DATE(date)这一步,直接用原字段就行。
内容的提问来源于stack exchange,提问作者Wilson Ellis
相关产品推荐
相关产品推荐

