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_agg
的 built 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 将两个集合合并为一个大结果集。
我是 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_agg
的 built 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 将两个集合合并为一个大结果集。