Select 基于价格和类别的产品 -SQL 请求

Select product based on price and categories -SQL Request

我是 SQL 的新手,想获得有关查询的帮助。

我有以下 tables:

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

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

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

我想要select所有具有特定语言且属于特定类别的产品。

有没有一种方法可以在一个请求中完成,或者我应该先 select 所有具有特定语言的产品,然后一个一个地查看它们是否在产品类别中 table?

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')

查看此 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 起)有一个名为 string_aggbuilt in function,如果您按如下方式操作脚本,则可以使用它:

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 post 引用。

  • INNER JOIN returns 两个结果集相交的集合。

  • LEFT OUTER JOIN returns 一个集合,其中左侧结果集中的所有行都存在,但只有右侧集合中的行与左侧相交。

  • RIGHT OUTER JOIN 与 LEFT OUTER JOIN 的作用相同,但相反。

  • FULL OUTER JOIN 将两个集合合并为一个大结果集。