如何编写SQL查询多对多关联场景下订单量最高的前5个商品?
订单量Top5商品查询SQL实现
首先多对多关联的Item表和Order表必然存在中间关联表(通常命名为order_item,存储两张表的主键映射关系),以下基于常规表结构给出实现方案:
常规表结构说明
- Item表核心字段:
item_id(商品唯一主键)、item_name(商品名称)等 - Order表核心字段:
order_id(订单唯一主键)等 - 中间关联表
order_item核心字段:order_id(关联订单主键)、item_id(关联商品主键)、quantity(可选,单订单内对应商品购买数量)
按订单数统计(同一订单内同款商品仅计数1次)
适合统计「多少个订单包含该商品」的场景:
SELECT i.item_id, i.item_name, COUNT(DISTINCT oi.order_id) AS order_quantity FROM Item i INNER JOIN order_item oi ON i.item_id = oi.item_id GROUP BY i.item_id, i.item_name ORDER BY order_quantity DESC LIMIT 5;
按销售件数统计(同一订单内同款商品买几件计数几次)
适合统计「商品累计售出多少件」的场景:
SELECT i.item_id, i.item_name, SUM(oi.quantity) AS sold_quantity FROM Item i INNER JOIN order_item oi ON i.item_id = oi.item_id GROUP BY i.item_id, i.item_name ORDER BY sold_quantity DESC LIMIT 5;
语法适配&注意事项
- 如果你的实际表名、字段名和示例命名不同,替换成对应业务的实际名称即可
- SQL Server:将开头的
SELECT替换为SELECT TOP 5,删除末尾的LIMIT 5 - Oracle 11g及更早版本:在语句末尾添加
WHERE ROWNUM <= 5,12c及以上版本可直接替换LIMIT 5为FETCH FIRST 5 ROWS ONLY
内容的提问来源于stack exchange,提问作者Nikola
相关产品推荐
相关产品推荐

