我有一個電子商務網站(使用VirtueMart),而我出售包括幼兒產品的產品。當產品是父母時,它沒有ParentID,而孩子則參考它。我知道,不是最好的邏輯,但我沒有創造它。
我的SQL是非常基本的,我相信我想要什麼東西時很容易做到這一點有孩子
- 選擇產品。
- 按價格排序(ASC/DSC)。
我有一個電子商務網站(使用VirtueMart),而我出售包括幼兒產品的產品。當產品是父母時,它沒有ParentID,而孩子則參考它。我知道,不是最好的邏輯,但我沒有創造它。
我的SQL是非常基本的,我相信我想要什麼東西時很容易做到這一點有孩子
由於多種原因,此表設計欠佳。首先,看起來值0被用於指示缺少父級(因爲產品沒有0 ID)。通常這將是一個NULL值。
如果它是一個NULL值,SQL語句來獲得無父把一切都如此簡單:
SELECT * FROM Products WHERE ParentID IS NULL
但是,我們不能這樣做。如果我們假設0 =沒有父項,我們可以這樣做:
SELECT * FROM Products WHERE ParentID = 0
但是,這是一個危險的假設。因此,要做到這一點(因爲你上面的架構)的正確途徑,將是比較兩個表,並確保的parentID存在是爲產品編號:
SELECT a.*
FROM Products AS a
WHERE EXISTS (SELECT * FROM Products AS b WHERE a.ID = b.ParentID)
接下來,拿到的價格,我們要加入這兩個表共同使用一個共同的ID。由於價格表似乎引用一個產品ID,我們可以使用像這樣:
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
這可能是按照您顯示的數據足夠,但通常這種類型的表結構表明,它可能有更多而不是與產品相關的一個價格(我們無法根據快照判斷這是否爲真)。
這應該讓你接近......如果你需要更多的東西,我們需要更多的細節。
你將不得不使用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它會過濾掉那些沒有任何孩子的所有條目。
我還沒有測試過,我希望它能工作。
SELECT * FROM Products INNER JOIN Prices ON Products.ProductID = Prices.ProductID ORDER BY Products.Price [ASC/DSC]
說明:
SELECT
- 選擇(獲取/檢索)
*
- ALL
FROM Products
- 從數據庫表中獲取他們的名字命名的 「產品」。
INNER JOIN Prices
- 只要兩個表中的列之間存在匹配,就選擇兩個表中的所有行。相反,使用數據庫表「價格」加入數據庫表「產品」。
ON
- 和WHERE
一樣,它定義了哪些行將被檢查匹配。
Products.ProductID = Prices.ProductID
- 您的符合條件。獲取數據庫表「產品」和「價格」中存在「產品ID」的行。
ORDER BY Products.Price [ASC/DSC]
- Sorting。升序使用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
注意:您的父母產品在價格表中都沒有價格。如果你想要他們的兒童產品的價格總和使用下面的腳本。
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
請標記您的分貝 –
您需要的[存在](http://www.w3resource.com/sql/special-operators/sql_exists.php)運算符。 – ceving
您正在使用[tag:common-table-expression]查找[tag:recursive-queries](您應該**真的**使用NULL而不是零來標識沒有父項的行。 '你的產品表中不能有適當的外鍵約束) –