SQL 初学者:从 2 个表中获取项目(+分组+排序)
SQL Beginner: Getting items from 2 tables (+grouping+ordering)
我有一个电子商务网站(使用 VirtueMart)并且我销售包含儿童产品的产品。当产品是父产品时,它没有 ParentID,而它的子产品会引用它。我知道,这不是最好的逻辑,但我没有创造它。
我的 SQL 非常基础,我相信我要求的东西很容易实现
- Select 个有子项的产品。
- 按价格排序结果 (ASC/DSC)。
您将不得不使用 self-join:
例如:
SELECT * FROM products parent
JOIN products children ON parent.id = children.parent_id
JOIN prices ON prices.product_id = children.id
ORDER BY prices.price
因为我们正在使用 JOIN,所以它会过滤掉所有没有子项的条目。
我还没有测试过,我希望它能工作。
这个 table 设计由于多种原因低于标准。首先,值 0 似乎用于指示缺少 parent(因为产品没有 0 ID)。通常这将是 NULL 值。
如果它是 NULL 值,SQL 语句获取没有 parent 的所有内容将像这样简单:
SELECT * FROM Products WHERE ParentID IS NULL
但是,我们不能那样做。如果我们假设 0 = no parent,我们可以这样做:
SELECT * FROM Products WHERE ParentID = 0
但是,这是一个危险的假设。因此,执行此操作的正确方法(给定上面的架构)是比较两个 table 并确保 parentID 作为 ProductID 存在:
SELECT a.*
FROM Products AS a
WHERE EXISTS (SELECT * FROM Products AS b WHERE a.ID = b.ParentID)
接下来,要获得定价,我们必须将这两个 table 加入一个公共 ID。由于价格 table 似乎引用了 ProductID,我们可以这样使用它:
SELECT p.ProductID, p.ProductName, pr.Price
FROM Products AS p INNER JOIN Prices AS pr ON p.ProductID = pr.ProductID
WHERE EXISTS (SELECT * FROM Products AS b WHERE p.ID = b.ParentID)
ORDER BY pr.Price
根据您显示的数据,这可能就足够了,但通常这种类型的 table 结构表明可能有多个价格与产品相关联(我们无法判断是否根据快速快照,这是正确的)。
这应该让你接近...如果你需要更多的东西,我们需要更多的细节。
SELECT * FROM Products INNER JOIN Prices ON Products.ProductID = Prices.ProductID ORDER BY Products.Price [ASC/DSC]
解释:
SELECT
- Select (Get/Retrieve)
*
- 全部
FROM Products
- 从名为 "Products".
的数据库 Table 中获取它们
INNER JOIN Prices
- Selects 两个表中的所有行,只要两个表中的列之间存在匹配项。相反,加入 DB Table "Products" 和 DB Table "Prices".
ON
- 与 WHERE
类似,这定义了将检查哪些行是否匹配。
Products.ProductID = Prices.ProductID
- 您的匹配标准。获取 DB Tables "Products" 和 "Prices".
中存在 "ProductID" 的行
ORDER BY Products.Price [ASC/DSC]
- 排序。使用 ASC
升序,DSC
降序。
如果您使用 ssms,请使用以下脚本。
SELECT pd.ProductId,ProductName,Price
FROM product pd
LEFT JOIN price pr ON pd.ProductId=pr.ProductID
WHERE EXISTS (SELECT 1 FROM product pd1 WHERE pd.productID=pd1.ParentID)
ORDER BY pr.Price ASC
注意:您的父产品都没有价格 table。如果您想要他们的子产品的价格总和,请使用以下脚本。
SELECT pd.ProductId,pd.ProductName,SUM(ISNULL(pr.Price,0)) SUM_ChildPrice
FROM product pd
LEFT JOIN product pd1 ON pd.productID=pd1.ParentID
LEFT JOIN price pr ON pd1.ProductId=pr.ProductID
GROUP BY pd.ProductId,pd.ProductName
ORDER BY pr.Price ASC
我有一个电子商务网站(使用 VirtueMart)并且我销售包含儿童产品的产品。当产品是父产品时,它没有 ParentID,而它的子产品会引用它。我知道,这不是最好的逻辑,但我没有创造它。
我的 SQL 非常基础,我相信我要求的东西很容易实现
- Select 个有子项的产品。
- 按价格排序结果 (ASC/DSC)。
您将不得不使用 self-join:
例如:
SELECT * FROM products parent
JOIN products children ON parent.id = children.parent_id
JOIN prices ON prices.product_id = children.id
ORDER BY prices.price
因为我们正在使用 JOIN,所以它会过滤掉所有没有子项的条目。
我还没有测试过,我希望它能工作。
这个 table 设计由于多种原因低于标准。首先,值 0 似乎用于指示缺少 parent(因为产品没有 0 ID)。通常这将是 NULL 值。
如果它是 NULL 值,SQL 语句获取没有 parent 的所有内容将像这样简单:
SELECT * FROM Products WHERE ParentID IS NULL
但是,我们不能那样做。如果我们假设 0 = no parent,我们可以这样做:
SELECT * FROM Products WHERE ParentID = 0
但是,这是一个危险的假设。因此,执行此操作的正确方法(给定上面的架构)是比较两个 table 并确保 parentID 作为 ProductID 存在:
SELECT a.*
FROM Products AS a
WHERE EXISTS (SELECT * FROM Products AS b WHERE a.ID = b.ParentID)
接下来,要获得定价,我们必须将这两个 table 加入一个公共 ID。由于价格 table 似乎引用了 ProductID,我们可以这样使用它:
SELECT p.ProductID, p.ProductName, pr.Price
FROM Products AS p INNER JOIN Prices AS pr ON p.ProductID = pr.ProductID
WHERE EXISTS (SELECT * FROM Products AS b WHERE p.ID = b.ParentID)
ORDER BY pr.Price
根据您显示的数据,这可能就足够了,但通常这种类型的 table 结构表明可能有多个价格与产品相关联(我们无法判断是否根据快速快照,这是正确的)。
这应该让你接近...如果你需要更多的东西,我们需要更多的细节。
SELECT * FROM Products INNER JOIN Prices ON Products.ProductID = Prices.ProductID ORDER BY Products.Price [ASC/DSC]
解释:
SELECT
- Select (Get/Retrieve)
*
- 全部
FROM Products
- 从名为 "Products".
INNER JOIN Prices
- Selects 两个表中的所有行,只要两个表中的列之间存在匹配项。相反,加入 DB Table "Products" 和 DB Table "Prices".
ON
- 与 WHERE
类似,这定义了将检查哪些行是否匹配。
Products.ProductID = Prices.ProductID
- 您的匹配标准。获取 DB Tables "Products" 和 "Prices".
ORDER BY Products.Price [ASC/DSC]
- 排序。使用 ASC
升序,DSC
降序。
如果您使用 ssms,请使用以下脚本。
SELECT pd.ProductId,ProductName,Price
FROM product pd
LEFT JOIN price pr ON pd.ProductId=pr.ProductID
WHERE EXISTS (SELECT 1 FROM product pd1 WHERE pd.productID=pd1.ParentID)
ORDER BY pr.Price ASC
注意:您的父产品都没有价格 table。如果您想要他们的子产品的价格总和,请使用以下脚本。
SELECT pd.ProductId,pd.ProductName,SUM(ISNULL(pr.Price,0)) SUM_ChildPrice
FROM product pd
LEFT JOIN product pd1 ON pd.productID=pd1.ParentID
LEFT JOIN price pr ON pd1.ProductId=pr.ProductID
GROUP BY pd.ProductId,pd.ProductName
ORDER BY pr.Price ASC