1

私は少し時間に追われているので、自分で答えを探すことができると思いますが、stackoverflowの方が速いです!:)

データの表があり、製品情報のふりをしてみましょう。このテーブルは、製品データがいつ更新されるかを追跡します。次のようなクエリを実行すると

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が高いほど、常に最新の変更になります

本当にありがとう!

4

3 に答える 3

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
于 2011-05-05T21:00:00.917 に答える
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
    )

{ Group, 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))
    )
于 2011-05-05T21:43:59.610 に答える
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

また

-- 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 を示す結果はどうですか?

于 2011-05-05T21:19:16.003 に答える