Что делать, если нужно пронумеровать строки прямо в запросе? Полистав руководство MySql 5.5, нужной функции я не нашел.
Мне нужно было сохранять позиции пользователей в рейтинге, т.е. пронумеровать пользователей в зависимости от значения их рейтинга.
Используя PHP
Если совсем не думать, то можно загрузить рейтинг в PHP, получить порядковый номер строк, и сохранить эти позиции в базу.
(Структура данных в данном случае абстрактна) это будет выглядеть как серия запросов:
1 2 3 4 |
//получим список в порядке убывания рейтинга SELECT user_id, rating_value FROM users ORDER BY rating_value DESC //выполним серию запросов на сохранение полученных позиций UPDATE users SET rating_position = %N WHERE user_id = %ID |
Получится множество запросов под управлением программы на PHP. Если немного подумать, то тоже самое можно сделать без PHP и всего одним запросом.
Без использования PHP
Используем переменную для вычисления позиции при запросе данных
1 2 3 |
SET @n = 0; SELECT (@n := @n + 1) AS POSITION, user_id, rating_value FROM users ORDER BY rating_value DESC; |
Для каждой строки MySql выполнит расчет позиции, так мы получим нужное значение POSITION (фактически, пронумеруем строки).
Встроим это сразу в UPDATE:
1 2 3 4 5 6 |
SET @n = 0; UPDATE `users`, (SELECT (@n := @n + 1) AS POSITION, user_id FROM users ORDER BY rating_value DESC) as SRC SET `users`.rating_position = SRC.POSITION WHERE `users`.user_id = SRC.user_id; |
Если бы автор попробовал сам, то обнаружил бы, что на SQL не работает.
Автор, уверяю, не просто пробовал, а использовал данный подход. Скорее всего, у вас что то не получилось в конкретной реализации.