MySQL PDO嵌套while循环查询每日全量用户数据异常问题咨询
MySQL PDO嵌套循环仅返回每日第一条数据修复方案
问题原因
- 首个查询分组逻辑存在缺陷:如果
fTera是带时分秒的datetime类型,第一个查询GROUP BY的是格式化后的仅日期字符串,但取出的fTera是分组内第一条记录的完整datetime值。第二层查询用该值做精确匹配时,只能匹配到当日相同时分秒的记录,导致仅返回第一条数据。 - 第二层循环的
if($paci != $tPaci)判断逻辑冗余无意义,可直接删除。
修正后代码
// 第一层循环:按日期分组查询当月有效记录 <?php $sql = $conn->prepare("SELECT count(id) AS total, DATE(fTera) AS fTera_date, DATE_FORMAT(fTera, '%d') AS day, DATE_FORMAT(fTera, '%d %M %Y') AS date FROM TERA WHERE MONTH(fTera) = MONTH(current_date) AND YEAR(fTera) = YEAR(current_date) AND active != 0 GROUP BY DATE(fTera) ASC"); $sql->execute(); while($row = $sql->fetch(PDO::FETCH_ASSOC)){ $fT = $row['fTera_date']; $paci = $row['total']; ?> // 第二层循环:查询当日所有有效用户 <?php $tera = $conn->prepare("SELECT * FROM TERA WHERE DATE(fTera) = :fecha AND active != 0"); $tera->bindParam(':fecha', $fT, PDO::PARAM_STR); $tera->execute(); while($row1 = $tera->fetch(PDO::FETCH_ASSOC)){ ?> <tr> <td class="center"><?php echo $row1['nombre']; ?></td> </tr> <?php } ?> // 第二层循环结束 <?php } ?> // 第一层循环结束
优化建议
如果数据量较大,嵌套查询会产生大量数据库请求,你可以直接单次查询当月所有有效数据,再在PHP层面按日期分组遍历,性能会更好。
内容的提问来源于stack exchange,提问作者Andrés
相关产品推荐
相关产品推荐

