You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于关联表ID改写SQL:将当日订单统计改为产品总数统计

没问题,我来帮你调整这个查询,实现统计当日订单对应产品总数的需求。这里有两种实用的写法,你可以根据自己的习惯选择:

方法一:JOIN关联表统计

这是最常用的关联查询方式,逻辑清晰且效率不错:

SELECT COUNT(op.id) AS total_products
FROM orders o
JOIN order_products op ON o.id = op.order_id
WHERE DATE(o.created_on) = CURDATE();

细节说明:

  • 用JOIN(内连接)关联两张表,只会保留有对应产品记录的订单(如果你的业务里存在空订单,且需要把这类订单的产品数算0,可以换成LEFT JOIN,但通常订单都会关联至少一个产品)。
  • 统计op.id而非COUNT(*)是个好习惯,能避免关联时可能出现的重复行干扰结果(不过这个场景下COUNT(*)也能得到正确值,因为每条order_products记录对应一个独立产品)。
  • 过滤条件依然锁定orders表的created_on,确保只统计当日生成的订单对应的产品。
方法二:子查询统计

如果更偏好直观的分步逻辑,子查询写法也能轻松实现:

SELECT COUNT(*) AS total_products
FROM order_products
WHERE order_id IN (
    SELECT id FROM orders WHERE DATE(created_on) = CURDATE()
);

细节说明:

  • 先通过子查询拿到当日所有订单的id集合,再在order_products表里统计这些order_id对应的记录总数——也就是当日所有订单的产品总和。
  • 这种写法对新手更友好,逻辑上更容易理解。
性能优化小技巧

如果orders表的created_on字段有索引,DATE(created_on) = CURDATE()会导致索引失效(因为函数包裹了字段)。可以改成范围查询来利用索引,提升大数据量下的查询速度:

-- 方法一优化版
SELECT COUNT(op.id) AS total_products
FROM orders o
JOIN order_products op ON o.id = op.order_id
WHERE o.created_on >= CURDATE() 
  AND o.created_on < DATE_ADD(CURDATE(), INTERVAL 1 DAY);

-- 方法二优化版
SELECT COUNT(*) AS total_products
FROM order_products
WHERE order_id IN (
    SELECT id FROM orders 
    WHERE created_on >= CURDATE() 
      AND created_on < DATE_ADD(CURDATE(), INTERVAL 1 DAY)
);

这样写后,数据库可以直接使用created_on的索引,查询效率会明显提升。

内容的提问来源于stack exchange,提问作者Kuubs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:17:22