MySQL破坏排名

问题描述 投票:0回答:1

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

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,但我不确定语法。

mysql database select join
1个回答
2
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.