
本文详解如何通过单条 left join 查询正确聚合来自两个 mysql 表(be 和 brikett_order)的月度统计数据,并在 php 中生成结构完整、行列对齐的 html 表格,避免因分步查询导致的表格错位问题。
在实际开发中,常需将多个数据源(如生产记录表 be 和订单表 brikett_order)按时间维度(如月份)进行汇总,并统一展示在同一张 HTML 表格中。但若采用两次独立查询 + 分段输出 ✅ 正确做法是:用一条 SQL 完成跨表关联与聚合计算,确保每行结果包含全部字段。 由于 be 表代表“生产记录”,brikett_order 表代表“已关闭订单”,二者通过 barcode 和 date 关联(注意:严格按日期匹配可能过于苛刻;实践中建议按年月对齐更合理)。以下优化后的 SQL 同时计算: 通过将逻辑收敛至单次查询,不仅解决了表格结构错乱问题,还提升了性能、可维护性与可读性——这是构建健壮数据报表的核心原则。 立即学习“PHP免费学习笔记(深入)”; 标签的方式(如原代码中先循环输出前三列,再单独循环输出第四列),极易破坏 HTML 表格的语义结构——导致
开闭不匹配、列数错乱、数据行错位(如 sum_order 仅出现在第二行末尾),最终渲染异常。 ✅ 推荐方案:使用 LEFT JOIN 实现月度聚合
SELECT
MONTH(be.date) AS month,
COUNT(DISTINCT DATE(be.date)) AS work_days,
COUNT(be.date) AS sum_number,
COALESCE(SUM(bo.amount), 0) AS sum_order
FROM be
LEFT JOIN brikett_order bo
ON bo.barcode = be.barcode
AND bo.state = 'zárt'
AND YEAR(bo.date) = YEAR(be.date)
AND MONTH(bo.date) = MONTH(be.date)
WHERE be.barcode = 'R-001'
GROUP BY month
ORDER BY month;
? 关键改进说明:使用 LEFT JOIN 确保即使某月无订单,生产数据仍保留,sum_order 显示为 0(COALESCE 防止 NULL);关联条件升级为 年+月对齐(而非精确到秒的 date = date),更符合业务逻辑;ORDER BY month 保证结果按自然月份升序排列。
✅ PHP 输出:一行一
,结构清晰可控
Havi Gyártás
0) {
while ($row = mysqli_fetch_assoc($result)) {
echo "Hónap
Munkanapok
Gyártás
Eladás
";
}
} else {
echo "{$row['month']}
{$row['work_days']}
{$row['sum_number']} db
{$row['sum_order']} db
";
}
?>
Nincs adat a kiválasztott cikkszámhoz. ⚠️ 注意事项与最佳实践











