Hello StackOverflow community:
Ситуация
Я создаю запрос на обновление, который устанавливает ранги для всех записей в таблице в соответствии с тем, как каждая запись сравнивается друг с другом.Пример таблицы:
id | budget | cost | rank | rank_score
1 | 500 | 20 | ? | ?
2 | 400 | 40 | ? | ?
3 | 300 | 40 | ? | ?
Таким образом, в этой таблице наибольшее значение при определении ранга имеют cost
, за которым следует budget
.Таким образом, запись № 2 будет выше, а запись № 3 будет второй, а № 1 будет последней.Как видите, если две записи имеют одинаковый cost
, то budget
разрывает связь.
Теперь, чтобы легко отследить такой «вес», я создаю rank_score
столбец, который будет содержать объединение cost
и budget
.Таким образом, rank_score
для приведенной выше таблицы будет выглядеть следующим образом:
id | budget | cost | rank | rank_score
1 | 500 | 20 | ? | 20500
2 | 400 | 40 | ? | 40400
3 | 300 | 40 | ? | 40300
Это rank_score
можно заполнить следующим образом:
UPDATE table_name
SET rank_score = CONCAT(cost, budget);
Проблема
Все в порядке, поэтомудалеко.Но теперь приходит проблема.Мне нужен только целочисленный столбец rank
для нескольких вещей, таких как сортировка, но прежде всего для , показывающего пользователю ранг его записи.Конечно, этот столбец rank
будет равен убыванию порядка rank_scores.Но я не могу найти способ вычислить этот столбец rank
в одном запросе на обновление без необходимости выполнять подзапросы, циклы в php и т. Д.
Что я пробовал
ИтакСначала я пытался получить вычисление rank_score
, например:
SELECT id,
CONCAT(cost, budget) AS rank_score
FROM table_name ;
, а затем зациклить в php все эти rank_scores, только чтобы создать запрос, который выглядит следующим образом:
UPDATE table_name
SET rank_score = CASE id WHEN 1 THEN 20500 END,
rank = CASE id WHEN 1 THEN 3 END
WHERE id IN (1) ;
... Конечно, этот пример запроса на обновление не завершен, поскольку в нем содержится больше предложений WHEN THEN END
для каждой записи в таблице.Излишне говорить, что это уродливо, особенно если вы ожидаете иметь тысячи и тысячи записей.
Итак, в заключение, у меня уже есть способ вычисления rank_score
, но я также хочу рассчитать rank
(= в порядке убывания рейтинга) в том же запросе или, по крайней мере, без выполнения этого сумасшедшего цикла php и предложений CASE WHEN THEN END
.
Спасибо за чтение и размышления об этом;)
Разъяснения
Разъяснение того, что сказал @ SJuan76: я не могу назначить ранг через php, поскольку есть случаи, когда пользователю будет показано фиксированное количество записей за раз (например, его страница пользователя: SELECT * WHERE user_id = 333
, который может получить 1, 3 или 8 записей), и он должен знать, каков ранг для каждой записи.Присвоение ранга через php в этом случае не работает, потому что такой ранг будет относиться к извлеченным записям, а не ко всем в таблице.