2010-11-04 91 views
1
DROP TABLE IF EXISTS `items_stock`; 
CREATE TABLE IF NOT EXISTS `items_stock` (
    `ItemStockID` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `ItemID` mediumint(8) unsigned NOT NULL, 
    `Date` date NOT NULL, 
    `CurrentStock` decimal(14,2) NOT NULL DEFAULT '0.00', 
    `CreatedBy` int(5) NOT NULL, 
    `CreatedDate` datetime NOT NULL, 
    `ModifiedBy` int(5) DEFAULT NULL, 
    `ModifiedDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, 
    `Active` enum('1','0') NOT NULL DEFAULT '1', 
    PRIMARY KEY (`ItemStockID`) 
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; 

INSERT INTO `items_stock` (`ItemStockID`, `ItemID`, `Date`, `CurrentStock`, `CreatedBy`, `CreatedDate`, `ModifiedBy`, `ModifiedDate`, `Active`) VALUES 

(1, 1, '2010-11-03', 500.00, 1, '2010-11-03 11:12:12', NULL, '2010-11-04 09:39:29', '1'), 
(2, 1, '2010-11-04', 400.00, 1, '2010-11-04 11:12:12', NULL, '2010-11-04 10:10:09', '1'), 
(3, 1, '2010-11-04', 700.00, 1, '2010-11-04 11:14:12', NULL, '0000-00-00 00:00:00', '1'), 
(4, 1, '2010-11-03', 600.00, 1, '2010-11-04 11:19:12', NULL, '2010-11-04 10:11:26', '1'), 
(5, 2, '2010-11-05', 800.00, 1, '2010-11-05 11:19:12', NULL, '2010-11-05 10:11:26', '1'); 

現在我想獲取當前所有項目的當前庫存(2010-11-05),例如ID爲1的當前庫存在700(ItemStockID 3)Max()GROUP BY(Aggregate)具有相同列值的功能問題

我試着用下面的查詢

SELECT MAX(DATE) AS DATE, ItemStockID, ItemID, CurrentStock FROM items_stock WHERE DATE <= '2010-11-05' AND Active = 1 GROUP BY ItemID; 

+------------+-------------+--------+--------------+ 
| DATE  | ItemStockID | ItemID | CurrentStock | 
+------------+-------------+--------+--------------+ 
| 2010-11-04 |   1 |  1 |  500.00 | 
| 2010-11-05 |   5 |  2 |  800.00 | 
+------------+-------------+--------+--------------+ 

但它並沒有給予適當當前的股票,如果同一天有一個以上的時間

實際結果應該是這樣的

+------------+-------------+--------+--------------+ 
| DATE  | ItemStockID | ItemID | CurrentStock | 
+------------+-------------+--------+--------------+ 
| 2010-11-04 |   3 |  1 |  700.00 | 
| 2010-11-05 |   5 |  2 |  800.00 | 
+------------+-------------+--------+--------------+ 

如果我用下面的查詢這是給上述結果

SELECT ISTI.ItemStockID, ISTI.DATE, ISTI.ItemID, ISTI.CurrentStock FROM items_stock AS ISTI 
JOIN (SELECT MAX(ItemStockID) AS ItemStockID 
     FROM items_stock AS IST 
      JOIN (SELECT MAX(DATE) AS DATE, ItemID FROM items_stock WHERE DATE <= '2010-11-05' AND Active = 1 GROUP BY ItemID) AS SD ON SD.Date = IST.Date AND IST.ItemID = SD.ItemID 
     GROUP BY IST.ItemID 
    ) AS ISTO ON ISTO.ItemStockID = ISTI.ItemStockID; 

你能告訴我如何獲得上述結果在最優化的方式

回答

0

我想這樣的解決方案,但在優化way

SELECT ISTI.ItemStockID, ISTI.DATE, ISTI.ItemID, ISTI.CurrentStock FROM items_stock AS ISTI 
JOIN (SELECT MAX(ItemStockID) AS ItemStockID 
     FROM items_stock AS IST 
      JOIN (SELECT MAX(DATE) AS DATE, ItemID FROM items_stock WHERE DATE <= '2010-11-05' AND Active = 1 GROUP BY ItemID) AS SD ON SD.Date = IST.Date AND IST.ItemID = SD.ItemID 
     GROUP BY IST.ItemID 
    ) AS ISTO ON ISTO.ItemStockID = ISTI.ItemStockID; 
1

嗯,我認爲MySQL的查詢是應該的行爲。你需要一個不同的查詢。 您的原始查詢將返回與您的組相匹配的組中的第一行。但是,你想要的是相反的。我想你想要對應於你的組的最後一行(最新的日期)。這個查詢應該給你你想要的結果。

select A.ItemId,A.DATE,A.CurrentStock,A.ItemStockID from (select ItemId,MAX(DATE) DATE from items_stock where DATE <= '2010-11-05' AND Active = 1 group by ItemId) I, items_stock A where A.ItemStockID=(select MAX(ItemStockID) from items_stock where ItemID=I.ItemId and DATE=I.DATE and Active=1) ; 
+0

不,我想max(日期)GROUP BY ItemID&如果日期相同,而得到最大(日期),它必須得到最大(ItemStockID)對於那些相同的日期。檢查我的答案http://stackoverflow.com/questions/4094073/max-group-by-aggregate-function-problem-with-same-column-values/4094388#4094388 – 2010-11-04 06:53:13

+0

這個假設是否成立?對於兩行A和B.如果A.ItemStockID> B.ItemStockID則A.DATE> = B.DATE。我認爲這是對的。那麼,這應該給你所問的結果。 – smartnut007 2010-11-04 06:57:22

+0

MAybe,你可以嘗試查詢,看看是否給你想要的結果。 – smartnut007 2010-11-04 06:59:11