2015-10-28 4 views
0

У меня есть 2 модели: Product и Sku, где Product имеет много Sku sСортировка по атрибуту цене дочернего модели

Я пытаюсь придумать интерфейс сортировки Поиск &, и у меня есть фильтры работают для продукта категория и т. д. Мой вопрос заключается в том, как вернуть ранжированные продукты по цене skus.

Например:

product | id: 1 
product | id: 2 
product | id: 3 

# Skus for Product 1 
sku | id: 1, product_id: 1, price: 1111 
sku | id: 5, product_id: 1, price: 5555 
sku | id: 9, product_id: 1, price: 9999 

# Skus for Product 2 
sku | id: 2, product_id: 2, price: 2222 
sku | id: 3, product_id: 2, price: 3333 
sku | id: 4, product_id: 2, price: 4444 

# Skus for Product 3 
sku | id: 6, product_id: 3, price: 6666 
sku | id: 7, product_id: 3, price: 7777 
sku | id: 8, product_id: 3, price: 8888 

Этакая по "цене от низкого до высокого" должен вернуть:

[ product 1, product 2, product 3 ] 

в то время как "цена от высокой к низкой" должен вернуть:

[ product 1, product 3, product 2 ] 

Это достаточно просто для 3-х продуктов, но у меня возникли проблемы с выяснением разбивки на страницы (т.е. тысячи продуктов, с последовательным о ffsets и т. д.).

Похоже, что это должна быть некоторая комбинация group by и поиск по sku с последующим поиском соответствующих product. Есть ли простой способ сделать этот тип заказов в Postgres?

Update

Это отличается упоминаемая "дубликат". У меня есть 2 модели здесь, и вы хотите отсортировать одну модель, основанную на значениях своих детей. У дублированного дубликата есть только 1 модель.

Для краевых кейсов: «привязка» по цене sku может быть решена (например, id asc для skus), если это согласовано. Продукты не имеют значений на заказ, и в БД нет дублированных продуктов.

+0

Возможный дубликат [max(), группировка и порядок] (http://stackoverflow.com/questions/6298703/max-group-by-and-order-by) – Cuagau

+0

Я считаю, что это дубликат http://stackoverflow.com/questions/6298703/max-group-by-and-order-by. ПРИСОЕДИНИТЕСЬ к продукту Sku, затем ЗАКАЗАТЬ МАКС (Sku.price). – Cuagau

+0

Разве это JSON в таблице? JSON - плохой выбор, поскольку sku - это хорошо структурированные данные. –

ответ

1

Для заказа по минимальному значению каждого ценового диапазона:

SELECT id 
FROM (
    SELECT p.id, min(s.price) as min_price 
    FROM product p 
    JOIN sku s on p.id = s.product_id 
    GROUP BY p.id 
) x 
ORDER BY min_price ASC 

Вы, вероятно, хотите это

SELECT p.productid 
from (
    SELECT p.productid, s.price, 
     ROW_NUMBER() OVER (PARTITION BY p.productid, ORDER BY s.price ASC) as rn 
    from product p 
    JOIN sku s on p.id = s.product_id 
) x 
where rn = 1 

и это

SELECT p.productid 
from (
    SELECT p.productid, s.price, 
     ROW_NUMBER() OVER (PARTITION BY p.productid, ORDER BY s.price DESC) as rn 
    from product p 
    join sku s on p.id = s.product_id 
) x 
where rn = 1 

Но, как я сказал, Я все еще не уверен, если вы заказываете по цене и удаление дубликатов продуктов (как это есть), или если вы хотите заказать минимальное значение и максимальное значение диапазона цен каждого продукта (как это делает «дубликат»).

+0

Спасибо за ваш ответ. Я хочу заказать по минимальной стоимости ценового диапазона каждого продукта – tyler

+1

ok дайте мне второй – Hogan

+0

Первый запрос отлично работает (с 'id' вместо' productid'). Благодаря! – tyler

Смежные вопросы