MySQL破坏排名

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL破坏排名相关的知识,希望对你有一定的参考价值。

我有以下查询返回一些事件详细信息,投票数和排名。

SELECT e.guid, 
       e.name,
       (SELECT COUNT(ev.event_vote_id) 
        FROM event_vote sv 
        WHERE ev.event_uid = s.guid) AS votes,
       @curRank := @curRank + 1 AS rank
FROM event e, (SELECT @curRank := 0) r
ORDER BY votes DESC

它返回正确的详细信息,包括投票,但排名被打破。

实际结果

guid | name | votes | rank

def    test2     2      2
abc    test1     1      1 
ghi    test3     0      3
jkl    test4     0      4

预期结果

guid | name | votes | rank

def    test2     2      1
abc    test1     1      2 
ghi    test3     0      3
jkl    test4     0      4

出于某种原因,test1的排名高于test2。

我假设我需要使用JOIN,但我不确定语法。

答案

您必须先计算投票,然后计算排名。

SELECT T.*, @curRank := @curRank + 1 AS rank
FROM ( SELECT e.guid, 
              e.name,
              (SELECT COUNT(ev.event_vote_id) 
               FROM event_vote sv 
               WHERE ev.event_uid = s.guid) AS votes
       FROM event e
    ) as T
CROSS JOIN  (SELECT @curRank := 0) r
ORDER BY votes DESC

你有错误的结果,因为SELECT部分出现在ORDER部分之前,所以你已经有一个等级,但没有必要匹配你最后得到的顺序。

可以在这里阅读更多相关信息:

Order Of Execution of the SQL query

以上是关于MySQL破坏排名的主要内容,如果未能解决你的问题,请参考以下文章

分享前端开发常用代码片段

被替换的片段不会被破坏

android - 从活动调用完成会破坏托管片段吗?

收藏|分享前端开发常用代码片段

关于js----------------分享前端开发常用代码片段

活动在片段上出现的权限对话框中被破坏