Сортировка и обновление SQL-запросов по номеру строки (пример SQLFiddle) - PullRequest
0 голосов
/ 20 октября 2019

У меня есть спортивная база данных, в которой я хочу отсортировать данные по настраиваемому полю («Рейтинг») и обновить поле («Рейтинг») номером строки.

Я пробовал следующий кодсортировать данные по моему настраиваемому полю «Рейтинг». Он работает, когда я сортирую его по обычному полю, но не по настраиваемому / вычисляемому полю. Когда сортировка будет завершена, я хочу, чтобы она обновила поле «Рейтинг» номером строки.

Т.е. боец ​​с самым высоким рейтингом должен иметь значение «1» как «Рейтинг».

SELECT id,lastname, wins, Round(((avg(indrating)*13) + (avg(Fightrating)*5) * 20) / 2,2) as Rating,
ROW_NUMBER() OVER (ORDER BY 'Rating' DESC) AS num
from fighters
JOIN fights ON fights.fighter1 = fighters.id
GROUP BY id

Приведенный выше код неправильно сортирует рейтинг. Он сортируется по номеру строки, но самый высокий рейтинг не оценивается как # 1. Это кажется немного случайным.

SQL Fiddle: http://sqlfiddle.com/#!9/aa1fca/1 (Этот пример правильно отсортирован, но я хочу обновить столбец «Рейтинг» по номеру строки, то есть бойцу с самым высоким рейтингом (от«Рейтингу») присваивается «1» в столбце «Рейтинги», второму по величине истребителю с рейтингом - «2» в столбце «Рейтинг» и т. Д.).

Также я хотел бы добавить предложение WHERE в таблицу бойцов. (где fighters.organization = 'UFC'), например.

1 Ответ

1 голос
/ 20 октября 2019

Во-первых, давайте исправим ваш запрос, чтобы он работал на MySQL <8.0. Это требует выполнения вычислений и сортировки в подзапросе, а затем с использованием переменной для вычисления ранга: </p>

select 
    id, 
    rating,
    @rnk := @rnk + 1 ranking
from 
    (select @rnk := 0) r
    cross join (
        select 
            fighter1 id,
            round(((avg(indrating)*13) + (avg(fightrating)*5) * 20) / 2,2) as rating
        from fights
        group by fighter1
        order by rating desc
    ) x

Теперь мы используем синтаксис update ... join ... set ... для обновления таблицы fighters:

update fighters f
inner join (
    select 
        id, 
        rating,
        @rnk := @rnk + 1 ranking
    from 
        (select @rnk := 0) r
        cross join (
            select 
                fighter1 id,
                round(((avg(indrating)*13) + (avg(fightrating)*5) * 20) / 2,2) as rating
            from fights
            group by fighter1
            order by rating desc
        ) x
) y on y.id = f.id
set f.ranking = y.ranking;

Демонстрация в скрипте MySQL 5.6 на основе скрипта, который вы указали в комментариях.

Запрос на выборку возвращает:

| id  | rating | ranking |
| --- | ------ | ------- |
| 3   | 219.5  | 1       |
| 4   | 213    | 2       |
| 1   | 169.5  | 3       |
| 2   | 156.5  | 4       |

А вот содержимое таблицы fighters после update:

| id  | lastname   | ranking |
| --- | ---------- | ------- |
| 1   | Gustafsson | 3       |
| 2   | Cyborg     | 4       |
| 3   | Jones      | 1       |
| 4   | Sonnen     | 2       |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...