2011-05-05 19 views
1

私は時間のためにちょっと急いでいますので、私は自分自身で答えを探すことができますが、stackoverflowは高速です! :)mysqlは2つの基準に基づいて選択します

私はそれが製品情報であるとふりデータを持つテーブルを持っています。テーブルは、製品データがいつ更新されるかを追跡します。私は

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

ありがとう、私の狂った質問を理解できてうれしいです!これは完全に働いた私はそれが同じテーブルへの結合である必要があるかもしれないと思った –

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

私は気にしないプロジェクトのための既存のデータベースではない偽のクエリのためにいくつかの結果を作っていた –

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)) 
    ) 
関連する問題