如何基于关联表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
相关产品推荐
相关产品推荐

