Другой вариант:
Очень неэффективный метод определения одного или двух элементов, но хорошее решение для тех, кто работает с PANDAS и Python и имеет много похожих запросов, заключается в том, чтобы загрузить ваш запрос SQL в Dataframe, а затем использовать Pandas 'инструменты ранжирования и запроса - в 2 этапа:
Шаг 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'