我有一个电子商务网站(使用VirtueMart),我销售的产品包含儿童产品。当产品是父产品时,它没有ParentID,而它的子产品引用它。我知道,不是最好的逻辑,但我没有创造它。
我的SQL非常基础,我相信我要求一些很容易实现的东西
答案 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,所以会过滤掉所有没有孩子的条目。
我还没有对它进行测试,我希望它能够正常运行。