MySQL使用ORDER BY获取指定记录行位置结果异常求助
解决MySQL排序后行号计算错误的问题
你的问题核心是MySQL的执行顺序导致的:变量@rownum的赋值操作是在ORDER BY排序之前执行的,所以你得到的position是数据未排序时的行号,而非排序后的位置。
下面提供两种可行的修复方案:
方案一:先排序再计算行号(兼容低版本MySQL)
先将排序后的结果作为子查询,再基于这个结果生成行号,确保行号是排序后的顺序:
SELECT x.position, x.cust_number, x.company, x.surname, x.first_name, x.title FROM (SELECT @rownum:=@rownum + 1 AS position, t.* FROM (SELECT c.cust_number, a.company, c.surname, c.first_name, c.title FROM 1_customer_records c LEFT JOIN addresses a ON c.fk_addresses_id = a.id ORDER BY a.company , c.surname , c.first_name , c.title) t JOIN (SELECT @rownum:=0) r) x WHERE x.cust_number = 43246;
方案二:使用窗口函数(MySQL 8.0+推荐)
如果你的MySQL版本是8.0及以上,建议使用ROW_NUMBER()窗口函数,它会直接在排序后的数据集上生成行号,逻辑更清晰且不易出错:
SELECT position, cust_number, company, surname, first_name, title FROM (SELECT c.cust_number, a.company, c.surname, c.first_name, c.title, ROW_NUMBER() OVER (ORDER BY a.company, c.surname, c.first_name, c.title) AS position FROM 1_customer_records c LEFT JOIN addresses a ON c.fk_addresses_id = a.id) x WHERE x.cust_number = 43246;
内容的提问来源于stack exchange,提问作者Stephen Bouffe
相关产品推荐
相关产品推荐

