2010-02-16 185 views
0

我一直在試圖弄清楚如何查詢購物車數據庫來查找所有包含有形物品的訂單(物品可以下載,因此未發貨),這些訂單尚未分配到UPS跟蹤標籤。我一直無法做到。ShoppingCart的複雜SQL查詢

相關表如下:

// dbo.Inventory - details about the individual product being sold 
- ProductID int primary - Name nvarchar - IsDownloadable bit - 
| 5      | Awesome Shirt | 0     | 
| 7      | An Audio Track | 1     | 

// dbo.ShoppingCart --("ShopID" groups the items in the cart) 
- CartID int primary - ProductID int - ShopID char (guid) - Quantity int - 
| 2     | 5    | e854a982c9264a72 | 4   | 
| 3     | 7    | e854a982c9264a72 | 1   | 

// dbo.Orders - Order information (shipping address, etc) 
- OrderID int primary - ShopID char(x) - BillingInfoColumns - 
| 13     | e854a982c9264a72 | Name,Address,etc | 

// dbo.Tracking - Shipments' (note: a shipment can contain several items) tracking numbers 
- TrackingID int primary - OrderID int - TrackingNumber char(x) - 
| 5      | 13   | Ze5Whatever...   | 

// dbo.ShippedItems - Maps a ShoppingCart's shipped items to tracking numbers 
- ShippingID int primary - TrackingID int - CartID int - QuantityInShipment int 
| 6      | 5    | 2   | 3      | 

希望上面提供的DB是如何設計的合理近似。

因此,要澄清我我需要:

  • 選擇的是還沒有發行的所有的有形物品的所有OrderIDs。

  • 非有形物品是IsDownloadable = 1

  • 必須考慮到ShoppingCart.Quantity柱。如果我們訂購4件T恤,我們可以將它們放在一個箱子中(帶有一個UPS追蹤標籤)。然後再一次,我們可以把每盒2個。或者我們可以將一件帶有一件襯衫的牛仔褲放在同一個盒子裏(再次,帶有一個跟蹤標籤)等等。

我一直在編寫無盡的JOIN和嵌套的WHERE NOT IN(SELECT * FROM)無效的垃圾。可悲的是,我似乎無法將我的頭圍繞它......我仍在等待我的靈感時刻。

我是比較新的SQL和數據庫設計,所以任何信息或(建設性)的批評將不勝感激。如果您認爲這會有所幫助,請隨意在數據庫本身的設計中打洞。 :-)


// I wish I could run this on my brain right now... 
// (Neurons, apparently, are "excitable") 
UPDATE Brain SET Neuron = 'Excited' WHERE Cortex = 'SQL' 

UPDATE

這裏是我想出了感謝伯努瓦Vidis。這是我在真實表格/數據上使用的實際查詢:

SELECT 
     d.OrderID 
    FROM 
     Person.ShoppingCart c 
    JOIN 
     Inventory.Item i 
    ON 
     i.ItemID = c.ItemID 
    JOIN 
     Orders.Details d 
    ON 
     d.ShopID = c.ShopID 
    LEFT JOIN 
     Orders.Shipping s 
    ON 
     d.OrderID = s.OrderID 
    LEFT JOIN 
     Orders.ShippedItems si 
    ON 
     s.ShippingID = si.ShippingID 
    WHERE 
     i.DownloadableMedia = 0 AND 
     d.Billed = 1 AND 
     d.Ordered = 1 
    GROUP BY 
     d.OrderID 
    HAVING 
     SUM(c.Quantity) > CASE WHEN SUM(si.Quantity) IS NULL THEN 0 ELSE SUM(si.Quantity) END 
+1

哇。我是否認爲ItemID實際上是一個ProductID,並且該LabelID是一個TrackingID?甚至可能會有更多的同義詞,但我無法弄清楚,因爲有這麼多的可能性。如果我是對的,我認爲你想盡快解決這個問題,因爲即使它現在不會讓你感到困惑,它會在以後。它肯定會讓我們對所有人(以及將維護你的代碼的人)感到困惑。 [如何更新問題以使用一致的命名?] – 2010-02-16 17:24:39

+0

Yikes,對不起。我的實際表格沒有像這樣飛行的同義詞。現在它是固定的。 +1指出。 – 2010-02-16 17:35:44

回答

1

您可能可以使用HAVING子句執行此操作。在MySQL中,它會看到這樣的:

SELECT 
    c.OrderID, 
    SUM(c.Quantity) AS tangible_products_number, 
    SUM(s.QuantityInShipment) as shipped_items_number 
FROM 
( 
    Inventory i, 
    ShoppingCart c 
) 
LEFT JOIN 
    ShippedItems s 
ON 
    c.OrderID = s.OrderID 
WHERE 
    i.ProductID = c.ItemID AND 
    i.IsDOwnloadable = 0 AND 
    c.OrderID = t.OrderID AND 
    s.CartID = c.ID 
GROUP BY 
    c.OrderID 
HAVING 
    SUM(c.Quantity) > SUM(s.QuantityInShipment) 

通過語法集團將可能需要適應於SQL-服務器

+0

感謝您的反饋。 ShoppingCart表沒有OrderID列。我試圖getit在SQL-Server中工作,但無法執行。 – 2010-02-16 17:48:15

+0

我認爲你的回答是引導我走向正確的方向。我現在需要做的是使SUM(s.QuantityShipment)= 0當s.QuantityShipment = NULL。 「HAVING 1 - NULL」是錯誤的。什麼是最好的方法來做到這一點? – 2010-02-16 18:04:53

+0

我標記你的答案是正確的,因爲它讓我朝着正確的方向前進。實際的答案已附加到我原來的問題。謝謝! – 2010-02-16 18:29:51

0

你能查詢dbo.Tracking哪裏的TrackingNumber是空的嗎?這會給你所需的信息嗎?

+0

那麼,TrackingNumber永遠不會爲空。該行不會創建,除非物品已發貨。另外,僅僅因爲我們有訂單的追蹤號碼並不意味着所有訂單的商品都已發貨。 – 2010-02-16 17:16:51

+0

是否可以創建一個位域OrderComplete?如果OrderComplete = 1表示所有物品已發貨。然後,您的查詢將是select * from dbo.Orders,其中OrderComplete = 1以獲取所有已交付所有商品的訂單。 – SidC 2010-02-16 17:32:54

+0

我想過那個。這看起來像是一個非關係的事情。要設置OrderComplete標誌,我必須在編程層次中循環訂單,項目,數量等。我也認爲這不可能是最佳做法。 – 2010-02-16 17:39:16