2016-08-23 71 views
0

enter image description hereSQL入門:獲取項目從2個表(+分組+排序)

我有一個電子商務網站(使用VirtueMart),而我出售包括幼兒產品的產品。當產品是父母時,它沒有ParentID,而孩子則參考它。我知道,不是最好的邏輯,但我沒有創造它。

我的SQL是非常基本的,我相信我想要什麼東西時很容易做到這一點有孩子

  • 選擇產品。
  • 按價格排序(ASC/DSC)。
+1

請標記您的分貝 –

+0

您需要的[存在](http://www.w3resource.com/sql/special-operators/sql_exists.php)運算符。 – ceving

+0

您正在使用[tag:common-table-expression]查找[tag:recursive-queries](您應該**真的**使用NULL而不是零來標識沒有父項的行。 '你的產品表中不能有適當的外鍵約束) –

回答

1

由於多種原因,此表設計欠佳。首先,看起來值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 

這可能是按照您顯示的數據足夠,但通常這種類型的表結構表明,它可能有更多而不是與產品相關的一個價格(我們無法根據快照判斷這是否爲真)。

這應該讓你接近......如果你需要更多的東西,我們需要更多的細節。

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它會過濾掉那些沒有任何孩子的所有條目。

我還沒有測試過,我希望它能工作。

1

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

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