【问题标题】:MySQL Broken RankMySQL 破排名
【发布时间】:2018-02-28 15:17:09
【问题描述】:

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

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】:

    你要先算票,再算排名。

    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

    【讨论】:

    • 我想通过加入 user_event 来明确这个用户。我在 AST 之后添加了“JOIN user_event ue ON t.guid = ue.selfie_uid WHERE ue.user_uid = '33c2fb85'”,但这给了我相反的答案(与用户无关的事件)。任何帮助,将不胜感激。谢谢。
    • 如果您创建一个新问题会更好。我无法理解您的查询,因为没有格式化。您可以链接此问题作为参考,但您需要包含有关新问题的所有相关信息。
    猜你喜欢
    • 2023-01-01
    • 2012-05-11
    • 2012-06-26
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多