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

  • Автор темы Автор темы alex77
  • Дата начала Дата начала

alex77

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

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

id | name | sort_order | rubric_id

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

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

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

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
 
alex77
можно сделать через пользовательские переменные, много лет назад на форуме был пример от chira (из букмарков уже стёрся), да и я вроде когда-то постил.
но так лучше не делать, или union или несколько запросов - быстрее, запрос понятнее. Или завести ещё поле, в котором хранить порядковый номер объекта в категории, выбирать одним запросом, но при обновлении данных пересчитывать. Тут уже сам решай.
 
можно в под запросе с начало отсортировать, а потом в запросе поставить условие в select, если сменилась категория, то локальную переменную обнулить, если нет, то инкриментировать...
 
оно то можно, но запрос с переменными будет сканировать всю таблицу и если записей over 9000, то несколько запросов, работающих по индексу (rubric_id,sort_order), будут быстрее.
 
для его задачи, лучше сделать еще таблицу и закидывать туда, товары которые нужно отображать в "топе" ;-)
 
iceman
Нормально, и при каждом update таблицы товаров эту таблицу перестраивать.
 
чистить раз в день "лишние данные", зато не будет так что в этой таблице 100500 записей.
 
дак не, я понял что надо создать таблицу и в неё выбирать новинки товаров, а при каждом обновлении основной таблицы с товарами очищать новинки и заполнять заново. Тогда откуда там наберётся 100500?
 
а не, бредовая идея

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