Выборка записей одним запросом

alex77

Новичок
Здравствуйте.

MySQL 5.1 есть таблица

id | name | sort_order | rubric_id

sort_order - порядок сортировки
rubric_id - id рубрики

Как выбрать не более N товаров из каждой рубрики, и отсортировать в пределах рубрики по sort_order ?

Хочется одним запросом. Отдельными запросами или UNION сам знаю.
 

iceman

говнокодер
ну в голову только лезет одно:

1) отсортировать,
2) присвоить отдельную нумерацию для записей для разных групп своя, начиная с 1
3) where нумерация<N

как бэ 2 подзапроса

как реализовать это на MySQL я х3 )

(в оракле я бы сделал так: select * from (select row_number() OVER(partition by t.rubric_id order by t.sort_number)) as x from table as t ) where x <= N
 

Gas

может по одной?
alex77
можно сделать через пользовательские переменные, много лет назад на форуме был пример от chira (из букмарков уже стёрся), да и я вроде когда-то постил.
но так лучше не делать, или union или несколько запросов - быстрее, запрос понятнее. Или завести ещё поле, в котором хранить порядковый номер объекта в категории, выбирать одним запросом, но при обновлении данных пересчитывать. Тут уже сам решай.
 

iceman

говнокодер
можно в под запросе с начало отсортировать, а потом в запросе поставить условие в select, если сменилась категория, то локальную переменную обнулить, если нет, то инкриментировать...
 

Gas

может по одной?
оно то можно, но запрос с переменными будет сканировать всю таблицу и если записей over 9000, то несколько запросов, работающих по индексу (rubric_id,sort_order), будут быстрее.
 

iceman

говнокодер
для его задачи, лучше сделать еще таблицу и закидывать туда, товары которые нужно отображать в "топе" ;-)
 

alex77

Новичок
iceman
Нормально, и при каждом update таблицы товаров эту таблицу перестраивать.
 

iceman

говнокодер
чистить раз в день "лишние данные", зато не будет так что в этой таблице 100500 записей.
 

alex77

Новичок
дак не, я понял что надо создать таблицу и в неё выбирать новинки товаров, а при каждом обновлении основной таблицы с товарами очищать новинки и заполнять заново. Тогда откуда там наберётся 100500?
 

iceman

говнокодер
а не, бредовая идея

можно тупо кешировать результат запроса выводящий_по_5_записей_для_каждой_категории в таблице, и обновлять ее каждый час например
 
Сверху