如何用SQL查询拥有最多食品数量的cartId
解决查询拥有最多食品数量cartId的问题
首先你当前的SQL有两个明显问题:
- 子查询里
FROM cart_items后面多了个逗号,这会直接触发语法错误 - 外层用
MAX(unitsInCart)逻辑无效,子查询已经算出每个cartId的总和,外层这样写无法关联到对应的cartId
下面给你几种可行的解决方法:
方法1:ORDER BY + LIMIT(适合单最大项场景)
先分组计算每个cartId的总食品数,按总数降序排序后取第一条记录:
SELECT cartId, SUM(unitsInCart) AS total_units FROM cart_items GROUP BY cartId ORDER BY total_units DESC LIMIT 1;
注意:如果存在多个cartId的总食品数并列最大,这种方法只会返回其中一个。
方法2:窗口函数(支持返回所有并列最大项)
如果需要把所有总食品数并列第一的cartId都查出来,用RANK()窗口函数:
WITH cart_totals AS ( SELECT cartId, SUM(unitsInCart) AS total_units, RANK() OVER (ORDER BY SUM(unitsInCart) DESC) AS rnk FROM cart_items GROUP BY cartId ) SELECT cartId, total_units FROM cart_totals WHERE rnk = 1;
RANK()会给所有并列第一的记录标记为1,这样就能返回所有符合条件的cartId。
方法3:子查询筛选最大值(兼容老版本数据库)
先算出所有cartId的最大总食品数,再关联查询对应的cartId:
SELECT cartId, SUM(unitsInCart) AS total_units FROM cart_items GROUP BY cartId HAVING SUM(unitsInCart) = ( SELECT MAX(total) FROM ( SELECT SUM(unitsInCart) AS total FROM cart_items GROUP BY cartId ) AS sub );
这种方法同样能返回所有总食品数等于最大值的cartId,适合不支持窗口函数的老版本数据库。
内容的提问来源于stack exchange,提问作者Leo C
相关产品推荐
相关产品推荐

