如何使用 JOIN 和多个排序条件创建 MySQL 5.6 Rank
How to create a MySQL 5.6 Rank with JOIN and multiple sorting criteria
我一直在尝试 return 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
另一个选项:
确定一个或两个项目的一种非常低效的方法,但对于那些使用 PANDAS 和 Python 并且有许多类似查询的人来说,一个很好的解决方案是下载您的 SQL 查询 Dataframe,然后使用 Pandas' 排名和查询工具 - 分两步:
步骤 1 - 运行 @GMB 上面的回答:
conn = pymysql.connect(host='localhost',
database='db',
user='user',
password='pass')
cur = conn.cursor()
rank_scores = """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 ;"""
df_scorerank = pd.read_sql(rank_scores, conn)
conn.close()
cur.close()
步骤 2 - 从 Pandas 数据框中提取您需要的排名:
chart_rank = df_scorerank.loc[df_scorerank['id'] == chart_id, 'rank'].item()
如上所述,数据框现在包含:
'ID','SCORE','SHEETSCORE', 'RANK'
'11767', '1', '0.7325', '1'
'11765', '1', '0.7325', '2'
'8365', '1', '0.6925', '3'
'8363', '1', '0.6925', '4'
'8615', '1', '0.6875', '5'
'8617', '1', '0.6875', '6'
'11646', '1', '0.685455', '7'
'11647', '1', '0.685455', '8'
我一直在尝试 return 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
另一个选项:
确定一个或两个项目的一种非常低效的方法,但对于那些使用 PANDAS 和 Python 并且有许多类似查询的人来说,一个很好的解决方案是下载您的 SQL 查询 Dataframe,然后使用 Pandas' 排名和查询工具 - 分两步:
步骤 1 - 运行 @GMB 上面的回答:
conn = pymysql.connect(host='localhost',
database='db',
user='user',
password='pass')
cur = conn.cursor()
rank_scores = """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 ;"""
df_scorerank = pd.read_sql(rank_scores, conn)
conn.close()
cur.close()
步骤 2 - 从 Pandas 数据框中提取您需要的排名:
chart_rank = df_scorerank.loc[df_scorerank['id'] == chart_id, 'rank'].item()
如上所述,数据框现在包含:
'ID','SCORE','SHEETSCORE', 'RANK'
'11767', '1', '0.7325', '1'
'11765', '1', '0.7325', '2'
'8365', '1', '0.6925', '3'
'8363', '1', '0.6925', '4'
'8615', '1', '0.6875', '5'
'8617', '1', '0.6875', '6'
'11646', '1', '0.685455', '7'
'11647', '1', '0.685455', '8'