如何在MySQL查询中使用Row_Number函数实现行号生成功能
MySQL实现ROW_NUMBER()行号生成的正确方案
原代码错误原因
- ORDER BY字段索引错误:你的SELECT语句仅返回3个字段(name、Qtd、rank),写
order by 5 desc找不到对应字段,会直接触发语法报错 - 行号计算时机错误:直接在聚合查询中计算行号,会导致行号在排序操作之前生成,最终行号顺序和你预期的Qtd降序规则不一致
方案1:MySQL 8.0及以上版本(推荐,和SQL Server用法完全一致)
直接用原生支持的窗口函数ROW_NUMBER(),无需手动维护变量,逻辑更稳定:
SELECT name, Qtd, ROW_NUMBER() OVER(ORDER BY Qtd DESC) AS rownum FROM ( SELECT i.name, SUM(quantity) Qtd FROM orders o JOIN order_items i ON o.id = i.order_id WHERE i.product_id NOT IN ('wpp001', '147426') GROUP BY i.name LIMIT 10 ) t
方案2:MySQL 5.x及更低版本(用用户变量实现)
先完成聚合、排序操作,再在外层计算行号,避免行号顺序错乱:
SET @rownum:=0; SELECT name, Qtd, @rownum := @rownum + 1 AS rownum FROM ( SELECT i.name, SUM(quantity) Qtd FROM orders o JOIN order_items i ON o.id = i.order_id WHERE i.product_id NOT IN ('wpp001', '147426') GROUP BY i.name ORDER BY Qtd DESC LIMIT 10 ) t
内容的提问来源于stack exchange,提问作者gqmonteiro
相关产品推荐
相关产品推荐

