powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как вытащить по одному товару из каждой категории?
10 сообщений из 10, страница 1 из 1
Как вытащить по одному товару из каждой категории?
    #39433905
mikeoleynik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не могу добиться следующего. Хочу с помощью запроса вытащить по одному товару из каждой категории. Т.е. есть категория "Автошины", в ней много товаров. Мне нужен только один товар. Есть категория "Масла", в ней лежит много товаров, мне нужен только один и т.д. Из товара мне нужно его detail_name.
Грубо говоря товаров 30.000, категорий 252. В итоге мне нужен массив с 252 товарами.

ProductCategory has_many :products
Product belongs_to :product_category
Еще есть таблица где ProductCategoryAssign:
:belongs_to => :product
:belongs_to => :product_category

Делаю что-то типа:
Код: plsql
1.
SELECT DISTINCT products.detail_name FROM (SELECT DISTINCT product_category_id, detail_name FROM products WHERE detail_name ILIKE '%шин%' ORDER BY name) products



На Ruby написал приблизительно то что нужно, но это костыли (N+1) и долго, нужно запросом вытягивать:
Код: ruby
1.
2.
3.
4.
5.
6.
7.
8.
@words = ProductCategory.all.flat_map do |pc|
      pc.products.where("detail_name ILIKE '%#{params[:oem]}%'").limit(1)
    end

    respond_to do |format|
      format.html
      format.json { render json: @words.map(&:detail_name) }
    end



или

Код: ruby
1.
products = Product.where('detail_name ILIKE %qqq%).pluck(:product_category_id, :detail_name).uniq(&:first).map(&:second)



Заранее спасибо
...
Рейтинг: 0 / 0
Как вытащить по одному товару из каждой категории?
    #39433921
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikeoleynik,

если и пробовать с DISTINCT, то обязательно с ON (distinct ON).
а так, можно использовать row_number(), либо попробовать любой из способов, описанных тут .
большая часть из них без переделок "взлетит" и на PostgreSQL
...
Рейтинг: 0 / 0
Как вытащить по одному товару из каждой категории?
    #39433933
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikeoleynik,

если используется 9.3+, то лучше всего использовать lateral join для такой задачи.
...
Рейтинг: 0 / 0
Как вытащить по одному товару из каждой категории?
    #39434214
mikeoleynik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В итоге получилось так

Код: sql
1.
2.
3.
4.
5.
SELECT MAX(product_category_assigns.product_id) AS product_id 
FROM "product_categories" 
INNER JOIN "product_category_assigns" ON "product_category_assigns"."product_category_id" = "product_categories"."id" 
WHERE "product_categories"."active" = 't' 
GROUP BY product_categories.id;
...
Рейтинг: 0 / 0
Как вытащить по одному товару из каждой категории?
    #39434224
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikeoleynikВ итоге получилось так

Код: sql
1.
2.
3.
4.
5.
SELECT MAX(product_category_assigns.product_id) AS product_id 
FROM "product_categories" 
INNER JOIN "product_category_assigns" ON "product_category_assigns"."product_category_id" = "product_categories"."id" 
WHERE "product_categories"."active" = 't' 
GROUP BY product_categories.id;



Будет очень небыстро работать если таблицы большие.
...
Рейтинг: 0 / 0
Как вытащить по одному товару из каждой категории?
    #39434235
Oleg Bartunov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikeoleynik,

великолепный пример от Саши Короткова http://akorotkov.github.io/blog/2016/06/17/faceted-search/ поможет вам.

Олег
...
Рейтинг: 0 / 0
Как вытащить по одному товару из каждой категории?
    #39434350
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg Bartunovmikeoleynik,

великолепный пример от Саши Короткова http://akorotkov.github.io/blog/2016/06/17/faceted-search/ поможет вам.

Олегкхм

хотя, для всего--то 30000, да если табла неширокая -- м.б. даже и ничего. м.б. даже и нормально.


если же табличка более существенная, то:
2ТС: отдельная табла категорий у вас есть ?

если есть -- см. рекомендацию. Алексуса.
если нет, но есть подходящие индексы -- попросите Максима найти ссылку на технику луз-индекскана. там всё просто. для 1:100 и далее и весьма существенной (в т.ч. по ширине) таблички оно может быть даже полезно.
...
Рейтинг: 0 / 0
Как вытащить по одному товару из каждой категории?
    #39434730
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqOleg Bartunovmikeoleynik,

великолепный пример от Саши Короткова http://akorotkov.github.io/blog/2016/06/17/faceted-search/ поможет вам.

Олегкхм

хотя, для всего--то 30000, да если табла неширокая -- м.б. даже и ничего. м.б. даже и нормально.


если же табличка более существенная, то:
2ТС: отдельная табла категорий у вас есть ?

если есть -- см. рекомендацию. Алексуса.
если нет, но есть подходящие индексы -- попросите Максима найти ссылку на технику луз-индекскана. там всё просто. для 1:100 и далее и весьма существенной (в т.ч. по ширине) таблички оно может быть даже полезно.

Есть новая версия этой презентации "с блэкджеком и шлюхами" как водится, только на английском:
How to teach an elephant to rock'n'roll
Стала сильно более внятной как мне кажется.
...
Рейтинг: 0 / 0
Как вытащить по одному товару из каждой категории?
    #39434767
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukЕсть новая версия этой презентации "с блэкджеком и шлюхами" как водится, только на английском:
How to teach an elephant to rock'n'roll

Отличная презентация, спасибо.
...
Рейтинг: 0 / 0
Как вытащить по одному товару из каждой категории?
    #39434893
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikeoleynik,

distinct on
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как вытащить по одному товару из каждой категории?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]