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

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 回答
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 回答