2016-06-18 3 views
1

Я довольно новичок в SQL и хотел бы получить справку по запросу.Выберите продукт, основанный на цене и категориях -SQL Request

У меня есть следующие таблицы:

#product 
------------------------------------------ 
| product_id | title | date | price | lang | 
------------------------------------------ 

#product_to_categories 
------------------------------- 
| id | category_id | product_id | 
------------------------------- 

#category 
-------------------- 
| category_id | name | 
-------------------- 

Я хотел бы, чтобы выбрать все продукты, которые имеют конкретный Ланг и принадлежащие к определенной категории.

Есть ли способ сделать в одном запросе, или я должен сначала выбрать весь продукт, который имеет определенный язык, а затем посмотреть один за другим, если они находятся в таблице продуктов в категории?

ответ

2

См интерактивный пример в этом SQLFiddle:

SELECT 
    p.title, 
    c.name as category 
FROM product p 
INNER JOIN product_to_categories pc on pc.product_id = p.product_id 
INNER JOIN category c on c.category_id = pc.category_id 
WHERE p.lang='en' and c.category_id in (3, 4) 

Пример результатов будет выглядеть следующим образом:

--------------- 
title | name 
--------------- 
Apple | Green 
Apple | Red 
Kiwi | Green 

Группировка категорий

Если вы хотите сгруппировать содержание, postgres (Начиная с 9.0) имеет built in function, называемый string_agg, что вы могли бы использовать, если вы манипулируете сценарий следующим образом:

SELECT 
    p.title, 
    string_agg(c.name, ', ') as category 
FROM product p 
INNER JOIN product_to_categories pc on pc.product_id = p.product_id 
INNER JOIN category c on c.category_id = pc.category_id 
WHERE p.lang='en' and c.category_id in (1, 3) 
GROUP BY p.product_id, p.title 
ORDER BY p.title 

Смотрите интерактивный пример в этом SQLFiddle.

Пример результатов будет выглядеть следующим образом:

--------------- 
title | name 
--------------- 
Apple | Red, Green 
Kiwi | Green 

Объяснение присоединяется

Понимание SQL присоединяется проще, когда вы знаете, как вы хотите, чтобы взаимодействовать с наборами результатов. Вот great reference. Изображения ссылаются на это сообщение на halfgaar.

  • INNER JOIN возвращает набор, где оба результата множества пересекаются.

Depiction of an INNER JOIN

  • LEFT OUTER JOIN возвращает набор, где все строки в левом наборе результатов присутствуют, но только строки из правильного набора, которые пересекаются с левой стороны.

Depiction of a LEFT OUTER JOIN

  • правого внешнего соединения делает то же самое, что левое внешнее соединение, но в обратном направлении.

Depiction of a RIGHT OUTER JOIN

  • FULL OUTER JOIN сочетает в себе оба множества в один большой набор.

Depiction of a FULL OUTER JOIN

+0

Спасибо за ваш ответ. Однако, если продукт влияет на несколько категорий, как он будет возвращен? Несколько строк одного и того же продукта, для каждого из которых есть название категории? – Anselme

+0

Я обновил ответ, чтобы дать образец результатов, хотя вы можете запустить его, используя ссылку на скрипт SQL, указанную в статье. Если для продукта существует несколько категорий, он будет возвращать несколько строк этого продукта. Не могли бы вы привести пример того, как вы хотите вернуть данные? – cbillowes

+0

Спасибо за SQL Fiddle, это очень здорово. Как-то я хотел бы избежать дублирования строки одного и того же продукта, и если продукт относится к категориям severa, то группируйте все названия категорий в строке продукта, разделенные комой. Я предполагаю, что это предложение GROUP BY полезно? – Anselme

2
SELECT  dbo.product.lang, dbo.product.product_id, dbo.product.title, dbo.product.date, dbo.product.prize, dbo.category.category_id AS Expr1 
FROM   dbo.product_to_categories INNER JOIN 
         dbo.product ON dbo.product_to_categories.product_id = dbo.product.product_id INNER JOIN 
         dbo.category ON dbo.product_to_categories.category_id = dbo.category.category_id 
WHERE  (dbo.product.lang = N'desiredang') AND (dbo.category.category_id = 'desired category id') 
+0

Большое спасибо! Есть ли способ предоставить массив идентификатора категории в предложении where? – Anselme

+0

(dbo.category.category_id in (id1, id2, id3, od4)) – Whencesoever