首页 > 解决方案 > 如何使用 JOIN 和多个排序条件创建 MySQL 5.6 Rank

问题描述

我被困在试图返回 SQL 查询的排名。

SELECT c.id, c.score, i.sheetscore, @curRank := @curRank + 1 AS rank
FROM chart c LEFT JOIN indicator as i
ON c.indicator_id = i.id, (
SELECT @curRank :=0
) q
ORDER BY c.score DESC, i.sheetscore DESC
;

最后一行应显示正确显示的排序等级。我应该看到 Rank = 1,2,3 但我得到了这个......我已经尝试了 SQL 语句的许多变体,但我无法解决这个问题。

'ID','SCORE','SHEETSCORE', 'RANK'
'11767', '1', '0.7325', '11767'
'11765', '1', '0.7325', '11765'
'8365', '1', '0.6925', '8365'
'8363', '1', '0.6925', '8363'
'8615', '1', '0.6875', '8615'
'8617', '1', '0.6875', '8617'
'11646', '1', '0.685455', '11646'
'11647', '1', '0.685455', '11647'

理想情况下,我会使用此查询:

SELECT RANK from Chart where ID= 11646  ## as an example

标签: mysqlsqlranking

解决方案


我建议先在子查询中加入和排序,然后计算排名。此外,您不应该混合使用隐式和显式连接 - 事实上,始终使用显式连接:

SELECT x.*, @curRank := @curRank + 1 AS rank
FROM (
    SELECT c.id, c.score, i.sheetscore
    FROM chart c 
    LEFT JOIN indicator i ON c.indicator_id = i.id
    ORDER BY c.score DESC, i.sheetscore DESC
) x
CROSS JOIN (SELECT @curRank :=0) q
ORDER BY score DESC, sheetscore DESC

请注意,如果您运行的是 MySQL 8.0,这很简单row_number()

SELECT 
    c.id, 
    c.score, 
    i.sheetscore, 
    ROW_NUMBER() OVER(ORDER BY c.score DESC, i.sheetscore DESC) rn
FROM chart c 
LEFT JOIN indicator i ON c.indicator_id = i.id
ORDER BY c.score DESC, i.sheetscore DESC

推荐阅读