我有以下查询,该查询返回一些事件详细信息,票数和排名。
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/