代码之家  ›  专栏  ›  技术社区  ›  David Murdoch

购物车的复杂SQL查询

  •  0
  • David Murdoch  · 技术社区  · 14 年前

    我一直在试图找出如何查询购物车数据库,以查找包含未分配UPS跟踪标签的有形物品(物品可以下载,因此,不可发货)的所有订单。我做不到。

    相关表格如下:

    // 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                      |
    

    希望上面提供了一个如何设计数据库的合理的近似值。

    所以,为了澄清我 认为 我需要:

    • 选择尚未发货所有有形项目的所有订单ID。

    • 非有形物品可下载=1

    • 必须考虑ShoppingCart.Quantity列。如果我们订购4件T恤,我们可以把它们放在一个盒子里(带有一个UPS跟踪标签)。然后,我们可以每盒放2个。或者我们可以把一条牛仔裤和一件衬衫放在同一个盒子里(同样,有一个跟踪标签)。

    我一直在用无止境的连接来编造废话,并且在(select*from)s中不存在的地方嵌套也没有用。可悲的是,我似乎无法将我的头环绕在它周围……我仍在等待我的发现时刻。

    我对SQL和数据库设计比较陌生,所以任何信息或(建设性的)批评都会受到极大的赞赏。如果您认为这会有所帮助,那么您可以随意在数据库本身的设计中钻出一些漏洞。-)


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

    更新

    感谢贝诺伊特·维迪斯,这就是我想出来的。这是我对实际表/数据使用的实际查询:

        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
    
    2 回复  |  直到 14 年前
        1
  •  1
  •   Benoît Vidis    14 年前

    您可能可以使用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 Server调整group-by语法。

        2
  •  0
  •   SidC    14 年前

    可以查询跟踪号为空的dbo.tracking吗?那能给你必要的信息吗?