MySQL按客户分组查询最受欢迎商品的实现问题求助
解决每个客户最受欢迎商品的SQL查询问题
你的原查询逻辑存在问题:子查询计算的是全局所有产品的购买次数最大值,而非每个客户各自的最大购买频次,因此无法正确关联到每个客户的分组数据。以下是正确的解决方案:
方案思路
- 先统计每个客户对每个产品的购买次数;
- 给每个客户的产品按购买次数降序排名;
- 筛选出排名第一的产品,关联菜单表获取产品名称。
最终SQL代码
WITH CustomerProductCounts AS ( -- 统计每个客户每个产品的购买次数 SELECT customer_id, product_id, COUNT(*) AS purchase_count FROM Sales GROUP BY customer_id, product_id ), RankedProducts AS ( -- 给每个客户的产品按购买次数降序排名 SELECT customer_id, product_id, purchase_count, ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY purchase_count DESC) AS rank_num FROM CustomerProductCounts ) -- 关联菜单表,筛选排名第一的产品 SELECT rp.customer_id, m.product_name FROM RankedProducts rp JOIN Menu m ON rp.product_id = m.product_id WHERE rp.rank_num = 1;
补充说明
- 如果需要支持并列最受欢迎的场景(比如某个客户有多个购买次数相同的高频产品),只需将
ROW_NUMBER()替换为RANK()即可,这样相同购买次数的产品都会被保留。 - 原查询中无需额外计算
maxFreq,通过窗口函数可以直接完成每个客户内部的排名筛选。
内容的提问来源于stack exchange,提问作者Farha Mansuri
相关产品推荐
相关产品推荐

