Получить общее количество строк при выборе только одной строки - PullRequest
2 голосов
/ 05 января 2020

Похожие / похожие вопросы: MySQL - Получить номер строки при выборе , Выбрать только частичный результат, но получить общее количество строк

У меня сейчас есть это таблица:

+----+--------------------+---------------+--------+
| id | accountId          | competitionId | rating |
+----+--------------------+---------------+--------+
|  1 | theidoftheaccount1 |            1  | 100    |
|  2 | theidoftheaccount2 |            3  | 90     |
|  3 | theidoftheaccount3 |            1  | 80     |
|  4 | theidoftheaccount4 |            1  | 50     |
+----+--------------------+---------------+--------+

Я хочу получить строку с accountId='theidoftheaccount3', поэтому я вызываю обычное SQL выражение SELECT * FROM competitors WHERE competitionId='someotherid1' AND accountId='theidoftheaccount3 ' ORDER BY rating DESC и все хорошо.

Проблема : Теперь я хочу узнать номер строки, которую я получил, но только из всех других строк, которые имеют competitionId='someotherid1'. Этот номер строки будет «рангом» участника из всех других участников того же соревнования.

Так что в конце дня я вернусь:

+----+--------------------+---------------+--------+-----------+
| id | accountId          | competitionId | rating | rowNumber |
+----+--------------------+---------------+--------+-----------+
|  3 | theidoftheaccount3 |            1  | 80     | 2         |
+----+--------------------+---------------+--------+-----------+

Как это можно сделать?

Ответы [ 2 ]

1 голос
/ 06 января 2020

Если ваша база данных не поддерживает оконные функции, альтернативой является использование подзапроса:

select
    t.*,
    (
        select count(*) + 1
        from mytable t1
        where t1.competitionId = t.competitionId and t1.rating > t.rating
    ) row_num
from mytable t
where t.accountId = 'theidoftheaccount3' 

Для производительности вам нужен индекс для столбцов (competitionId, rating) (а другой для столбца accountId, но, возможно, он уже существует, поскольку выглядит как столбец unique.

1 голос
/ 05 января 2020

Один метод заключается в использовании row_number() в подзапросе:

select c.*
from (select c.*,
             rank() over (partition by competitionid order by rating desc) as ranking
      from competitors c
      where competitionId = 'someotherid1'
     ) c
where accountId = 'theidoftheaccount3';

РЕДАКТИРОВАТЬ:

Альтернатива без оконных функций:

select count(*) + 1 as ranking
from competitors c
where c.competitionId = 'someotherid1' and
      c.rating > (select c2.rating
                  from competitors c2
                  where c2.competitionid = c.competitionId and
                        c2.accountId = 'theidoftheaccount3' 
                 );
...