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破坏排名的主要内容,如果未能解决你的问题,请参考以下文章