mysql - 如何使用 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
解决方案
我建议先在子查询中加入和排序,然后计算排名。此外,您不应该混合使用隐式和显式连接 - 事实上,始终使用显式连接:
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
推荐阅读
- keycloak - 在 quarkus 中使用路径变量创建基于 Keycloak JS 的策略
- azure - ARM 模板:从 Vault 和 Secrets 获取输出时出现资源未找到错误
- discord - 自动断开耳聋用户的 Discord Bot
- r - R中的负数模
- node.js - StripeInvalidRequestError: No such setupintent: 'seti_...'
- django - Django - 如何在两个数据库之间复制一个特定的模型实例
- flutter - 滚动时小部件闪烁并消失
- iot - 物联网中心自定义规则
- r - 检测语言环境时出错:read.table 中的错误(file = file,header = header .. 如何解决这个问题?
- python - 自己的类的类似 Numpy 的方法