Определить на какой странице пейджинга окажется запись (ROW_NUMBER() в MySQL)

13.11.2009 22:01 / Артём Волк / 1621 просмотр / ...

В процессе разработки приложения понадобилось с помощью SQL-запроса к MySQL-базе определить на какой странице пейджинга окажется определённая запись. Ситуация осложнялась тем, что записи могли быть отсортированы по разному.

Для того, чтобы определить на какой странице окажется запись нужно знать номер записи с начала списка и размер страницы. Количество записей на странице обычно задано, так что остаётся узнать порядковый номер записи в результате определённого запроса (т.е. необходим некий аналог функции ROW_NUMBER() из MS SQL).

Для примера используем гипотетическую таблицу заказов orders, имеющую как минимум два поля: автоинкрементное поле первичного ключа id, и поле, хранящее дату создания заказа date_created.

Первая попытка дала вот такое решение:

set @num  = 0;
SELECT `number` FROM
(
	SELECT 
		@num:=@num+1 as `number`, 
		`orders`.* 
	FROM `orders`
	ORDER BY `date_created` ASC -- тут указывается условие сортировки
) as `temp_table`
WHERE `id` = 12

Но, оказывается, есть альтернативный вариант:

SELECT `number` FROM
(
	SELECT 
		@num:=@num+1 as `number`, 
		`orders`.* 
	FROM `orders`, (SELECT @num := 0) as t
	ORDER BY `date_created` ASC -- тут указывается условие сортировки 
) as `temp_table`
WHERE `id` = 12