2012-06-21 59 views
1

我有一個查詢,我正在使用總結股票總計和顯示每個股票項目更新的最後日期。我有兩種不同的庫存類型0和1(傳入,傳出)。我希望能夠放在頁面的底部「最近收到的股票是:」&「最後一批貨是在:」。結合三個(複雜)查詢

繼承人什麼,我有我的主要查詢組,總結庫存:

$query = "Select * 
      FROM (SELECT id, type, color, product, 
         SUM(Quantity) AS TotalQuantity, MAX(Date) AS LatestDate 
       FROM inventory 
       GROUP BY id, color, type) AS alias 
      WHERE TotalQuantity > 0"; 

現在我希望能也運行這兩個查詢,以搶「股票」 0最後更新的時間和1(傳入,傳出)

$query = "SELECT MAX(Date) FROM inventory WHERE stock = 0"; 

$query = "SELECT MAX(Date) FROM inventory WHERE stock = 1"; 

結合這三個查詢的任何幫助?我在嘗試聯盟,但沒有多少運氣。

+0

SELECT id, color, type, product, SUM(Quantity) AS TotalQuantity, MAX(Date) AS LatestDate FROM inventory GROUP BY id, color, type HAVING SUM(Quantity) > 0 

您可以將聚合函數MAX()中結合使用條件檢查查詢2和3對不起,'SELECT MAX(Date)FROM inventory WHERE stock = 0'有什麼複雜的? – Seph

+0

@Seph第一個複雜;)如果它是三個SELECT MAX(日期)我大概可以弄明白。 – cantaffordretail

回答

3

嘗試這樣:

SELECT alias.*, 
    zeroStock.zeroDate, 
    nonzeroStock.nonzeroDate 
FROM 
    (
     SELECT id, 
      type, 
      color, 
      product, 
      SUM(Quantity) AS TotalQuantity, 
      MAX(Date) AS LatestDate 
     FROM inventory 
     GROUP BY id, color, type 
    ) alias INNER JOIN 
    (
     SELECT id, MAX(Date) zeroDate 
     FROM inventory 
     WHERE stock = 0 
     GROUP BY id 
    ) zeroStock on alias.id = zeroStock.id 
    INNER JOIN 
    (
     SELECT id, MAX(Date) nonzeroDate 
     FROM inventory 
     WHERE stock = 1 
     GROUP BY id 
    ) nonzeroStock on alias.id = nonzeroStock.id 
WHERE alias.TotalQuantity > 0 
1

您可以使用CROSS JOIN的日期添加到你的正常select語句的每一行。

SELECT * 
FROM (
      SELECT * 
      FROM (
        SELECT id, type, color, product, SUM(Quantity) AS TotalQuantity, MAX(Date) AS LatestDate 
        FROM inventory 
        GROUP BY 
          id, color, type 
       ) AS alias 
      WHERE TotalQuantity > 0 
     ) AS q 
     CROSS JOIN (SELECT MAX(Date) AS MaxIncoming FROM Inventory WHERE stock = 0) AS r 
     CROSS JOIN (SELECT MAX(Date) AS MaxOutgoing FROM Inventory WHERE stock = 1) AS s 

Mysql Cross Join

Cross Join is also called Cartesian Product Join. The Cross Join in SQL return you a result table in which each row from the first table is combined with each rows from the second table

編輯

備案,您可以通過使用HAVING條款,而不是你的TotalQuantity的WHERE條款的簡化聲明。

SELECT * 
FROM (
      SELECT id, type, color, product, SUM(Quantity) AS TotalQuantity, MAX(Date) AS LatestDate 
      FROM inventory 
      GROUP BY 
        id, color, type 
      HAVING 
        SUM(Quantity) > 0   
     ) AS q 
     CROSS JOIN (SELECT MAX(Date) AS MaxIncoming FROM Inventory WHERE stock = 0) AS r 
     CROSS JOIN (SELECT MAX(Date) AS MaxOutgoing FROM Inventory WHERE stock = 1) AS s   
+0

看起來很有希望,但我得到一個錯誤:...語法使用附近'選擇最大(日期)AS MaxOutgoing從庫存WHERE股票= 1)AS r' – cantaffordretail

+0

@mcflause - 我的壞。我改變了陳述。你能證實嗎? –

2

試試這個

Select 
    alias.id, 
    alias.type, 
    alias.color, 
    alias.product, 
    Stock0.S0, 
    Stock1.S1 
FROM (SELECT 
     id, 
     type, 
     color, 
     product, 
     SUM(Quantity) AS TotalQuantity, 
     MAX(Date)  AS LatestDate 
     FROM inventory 
     GROUP BY id, color, type) AS alias 
    left join (SELECT 
       id, 
       MAX(Date)   S0 
      FROM inventory 
      WHERE stock = 0) as Stock0 
    on Stock0.id = alias.id 
    left join (SELECT 
       id, 
       MAX(Date)   S1 
      FROM inventory 
      WHERE stock = 0) as Stock1 
    on Stock1.id = alias.id 
WHERE TotalQuantity > 0 
+0

你測試過這個查詢嗎? –

0
SELECT id, type, color, product, 
        SUM(Quantity) AS TotalQuantity, MAX(Date) AS LatestDate, null AS stock 
      FROM inventory 
      GROUP BY id, color, type 
HAVING TotalQuantity > 0 

UNION ALL 

SELECT null, null, null, null, null, MAX(Date), stock 
FROM inventory WHERE stock IN (0,1) GROUP BY stock 
0

你最好不要運行查詢2和查詢1查詢2 3分別和3是一個單獨的關注,從查詢1,因爲你是打算獲得個人價值觀而不是多列列表。同樣,你在查詢1中篩選結果,但在2和3中篩選結果。

當然,你可以在子查詢上執行兩次CROSS JOIN,但是你將在數據庫和應用程序之間傳輸更多不必要的數據。您只需要檢索兩個,而不是兩個整列(我可能會添加它們,與結果集的其餘部分無關 - 進一步強調它的不雅感)。

此外,CROSS JOIN方法假定滿足SUM(Quantity) > 0條件會有至少一排。如果它們都不滿足呢? ...那麼你也不會有你最新的進出庫存日期!雖然可能不太可能,但這個用例必須考慮在內。

說了這麼多,你可以重寫你的第一個查詢,以避免一個子查詢:

SELECT 
    MAX(CASE WHEN stock = 0 THEN Date ELSE NULL END) AS s0_maxdate, 
    MAX(CASE WHEN stock = 1 THEN Date ELSE NULL END) AS s1_maxdate 
FROM 
    inventory