首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >行号MySQL不正确

行号MySQL不正确
EN

Stack Overflow用户
提问于 2020-11-24 06:09:30
回答 2查看 24关注 0票数 1

我在MySQL中有以下表格:

代码语言:javascript
复制
+--------------------------------------------------+
+  id  | type | recordTimeMS | created             +
+--------------------------------------------------+
+  172 | 3    | 125015       | 2020-11-15 20:23:45 +
+  159 | 3    | 116828       | 2020-11-15 20:56:24 +
+  151 | 3    | 115015       | 2020-11-15 22:23:45 +
+  171 | 3    | 136828       | 2020-11-15 21:56:24 +
+ ....                                             +
+--------------------------------------------------+

我尝试按recordTimeMS和by created对其进行排序,并使用以下select获得行号(as rank):

代码语言:javascript
复制
SELECT @row_number := @row_number + 1 as rank, utr.id, utr.recordTimeMS, utr.created 
    FROM UserTimeRecord utr,
        (SELECT @row_number:=0) rn
    WHERE type = 3
    ORDER BY utr.recordTimeMS, utr.created
    LIMIT 10

元素的排序是正确的,但排名不正确,结果如下:

代码语言:javascript
复制
+--------------------------------------------------+
+  rank | id  | recordTimeMS | created             +
+--------------------------------------------------+
+    3  | 151 | 115015       | 2020-11-15 22:23:45 +
+    2  | 159 | 116828       | 2020-11-15 20:56:24 +
+    1  | 172 | 125015       | 2020-11-15 20:23:45 +
+    4  | 171 | 136828       | 2020-11-15 21:56:24 +
+--------------------------------------------------+

是什么导致了这种情况,还有其他方法可以做到吗?

EN

回答 2

Stack Overflow用户

发布于 2020-11-24 06:47:57

感谢@Barmar给我指出了ROW_NUMBER()-function,它使它变得简单得多:

代码语言:javascript
复制
SELECT ROW_NUMBER() OVER (ORDER BY recordTimeMS, created) as rank, 
        utr.id, utr.recordTimeMS, utr.created 
    FROM UserTimeRecord utr 
    WHERE type = 3 
    LIMIT 10 

并产生正确的结果:

代码语言:javascript
复制
+--------------------------------------------------+
+  rank | id  | recordTimeMS | created             +
+--------------------------------------------------+
+    1  | 151 | 115015       | 2020-11-15 22:23:45 +
+    2  | 159 | 116828       | 2020-11-15 20:56:24 +
+    3  | 172 | 125015       | 2020-11-15 20:23:45 +
+    4  | 171 | 136828       | 2020-11-15 21:56:24 +
+--------------------------------------------------+
票数 1
EN

Stack Overflow用户

发布于 2020-11-24 06:31:32

您需要在子查询中进行排序,并在主查询中进行行数计算。

否则,在某些情况下,MySQL将首先执行@row_number赋值,然后在将这些赋值替换到结果集中后执行排序。

代码语言:javascript
复制
SELECT @row_number := @row_number + 1 as rank, utr.id, utr.recordTimeMS, utr.created 
FROM (
    SELECT id, recordTimeMS, created
    FROM UserTimeRecord 
    WHERE type = 3
    ORDER BY recordTimeMS, created
    LIMIT 10
) AS utr,
(SELECT @row_number:=0) rn
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64977256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档