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

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 - MySQL破排名,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49032871/

10-16 01:45