You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 15:25:49