См интерактивный пример в этом 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 возвращает набор, где оба результата множества пересекаются.
- LEFT OUTER JOIN возвращает набор, где все строки в левом наборе результатов присутствуют, но только строки из правильного набора, которые пересекаются с левой стороны.
- правого внешнего соединения делает то же самое, что левое внешнее соединение, но в обратном направлении.
- FULL OUTER JOIN сочетает в себе оба множества в один большой набор.
Спасибо за ваш ответ. Однако, если продукт влияет на несколько категорий, как он будет возвращен? Несколько строк одного и того же продукта, для каждого из которых есть название категории? – Anselme
Я обновил ответ, чтобы дать образец результатов, хотя вы можете запустить его, используя ссылку на скрипт SQL, указанную в статье. Если для продукта существует несколько категорий, он будет возвращать несколько строк этого продукта. Не могли бы вы привести пример того, как вы хотите вернуть данные? – cbillowes
Спасибо за SQL Fiddle, это очень здорово. Как-то я хотел бы избежать дублирования строки одного и того же продукта, и если продукт относится к категориям severa, то группируйте все названия категорий в строке продукта, разделенные комой. Я предполагаю, что это предложение GROUP BY полезно? – Anselme