SQL初学者:从2个表中获取项目(+分组+排序)

时间:2016-08-23 07:17:21

标签: sql virtuemart

enter image description here

我有一个电子商务网站(使用VirtueMart),我销售的产品包含儿童产品。当产品是父产品时,它没有ParentID,而它的子产品引用它。我知道,不是最好的逻辑,但我没有创造它。

我的SQL非常基础,我相信我要求一些很容易实现的东西

  • 选择有孩子的产品。
  • 按价格排序结果(ASC / DSC)。

4 个答案:

答案 0 :(得分:2)

SELECT * FROM Products INNER JOIN Prices ON Products.ProductID = Prices.ProductID ORDER BY Products.Price [ASC/DSC]

说明:

SELECT - 选择(获取/检索)

* - 全部

FROM Products - 从名为“Products”的数据库表中获取它们。

INNER JOIN Prices - 只要两个表中的列之间存在匹配,就从两个表中选择所有行。相反,使用DB表“价格”加入数据库表“产品”。

ON - 与WHERE类似,它定义了要检查哪些行匹配。

Products.ProductID = Prices.ProductID - 您的匹配条件。获取“ProductID”存在于DB Tables“Products”和“Prices”中的行。

ORDER BY Products.Price [ASC/DSC] - 排序。将ASC用于升序,DSC用于降序。

答案 1 :(得分:1)

由于多种原因,此表设计不足。首先,似乎值0用于表示缺少父母(因为产品没有0 ID)。通常,这将是一个NULL值。

如果它是NULL值,那么获取没有父项的所有内容的SQL语句就像这样简单:

SELECT * FROM Products WHERE ParentID IS NULL

然而,我们无法做到这一点。如果我们假设0 =没有父,我们可以这样做:

SELECT * FROM Products WHERE ParentID = 0

但是,这是一个危险的假设。因此,执行此操作的正确方法(根据上面的模式)将比较两个表并确保parentID作为ProductID存在:

SELECT a.* 
FROM Products AS a 
WHERE EXISTS (SELECT * FROM Products AS b WHERE a.ID = b.ParentID)

接下来,为了获得定价,我们必须将这两个表一起加入公共ID。由于Price表似乎引用了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

根据您显示的数据,这可能就足够了,但通常这种类型的表结构表明可能有多个价格与产品相关联(我们无法根据快速快照判断这是否属实。

这应该让你接近......如果你需要更多东西,我们需要更多细节。

答案 2 :(得分:1)

如果您使用的是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

注意:您的父产品都没有价格表中的价格。如果您想要其子产品的价格总和,请使用以下脚本。

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

答案 3 :(得分:0)

您必须使用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,所以会过滤掉所有没有孩子的条目。

我还没有对它进行测试,我希望它能够正常运行。