2011-05-05 133 views
1

我有點匆忙的時間,所以我知道我可以自己尋找答案,但stackoverflow更快! :)mysql根據兩個條件選擇

我有一個數據表讓我們假裝它是產品信息。該表會跟蹤產品數據何時更新。如果我運行一個查詢像

SELECT * FROM productChangeLog where change = 'price changed' 

我得到這樣

id product date  change 
---------------------------------------------  
236 product1 03/14/2011 'price changed'  
241 product2 03/14/2011 'price changed'  
242 product2 03/14/2011 'description changed'  
512 product1 05/16/2011 'price changed'  
517 product1 05/16/2011 'description changed' 

結果就是我想要做的就是選擇只有最近的每個產品的「價格變動」。我需要添加到我的查詢,以便我只能得到第241和512行?更高的ID總是最近的變化

非常感謝!

回答

2
SELECT t.max_id, t.product, pcl.date, pcl.change 
    FROM (SELECT product, MAX(id) AS max_id 
       FROM productChangeLog 
       WHERE change = 'price changed' 
       GROUP BY product) t 
     INNER JOIN productChangeLog pcl 
      ON t.max_id = pcl.id 
+0

謝謝我很高興你能理解我的瘋狂問題!這工作完美我認爲它可能必須是一個加入到同一個表 – 2011-05-05 21:24:24

0

GROUP BY按鍵字段並使用HAVING子句提取記錄。

在你的情況,你可以嘗試,

-- Don't use this if the product data can be updated twice on 
-- the same day since the date field doesn't have a timestamp 
SELECT * FROM productChangeLog where change = 'price changed' 
GROUP BY product HAVING MAX(date) = date 

OR

-- Assuming the id is an integer field, this might be faster 
SELECT * FROM productChangeLog where change = 'price changed' 
GROUP BY product HAVING MAX(id) = id 

這些都是標準的SQL查詢違法,但應該在MySQL的工作。

順便說一句,你的結果如何顯示行242和517'描述改變'?

+0

它不是我只是粗心,當我彌補了一個虛假的查詢在一個非現有的數據庫中的一個保密項目的結果:) – 2011-05-05 21:25:45

0

這種方法完成同樣的事情,但使用ANSI語法,並可以擴展到包括多個字段:

SELECT 
    * 
FROM 
    Table AS T1 
WHERE 
    NOT EXISTS 
    (
    SELECT * FROM Table AS T2 WHERE T1.Group = T2.Group AND T2.Date < T1.Date 
    ) 

如果{集團,日期}不是唯一的,你只需要多一點代碼:

SELECT 
    * 
FROM 
    Table AS T1 
WHERE 
    NOT EXISTS 
    (
    SELECT * FROM Table AS T2 WHERE T1.Group = T2.Group AND (T2.Date < T1.Date OR (T1.Date = T2.Date AND T2.ID < T1.ID)) 
    )