查询:获取每个成员故障的最后一条记录由另一个值引起

时间:2014-11-20 01:58:16

标签: mysql

我有以下数据,例如

     id      product_id   date  
  ------     ----------   ----
     1           1         1
     2           1         2
     3           1         3
     4           2         1
     5           2         2
     6           2         2
     7           3         1

我想要的结果数据查询"每个product_id上的最后日期的最后一条记录"

得到结果我使用下面的查询

SELECT a.* FROM test AS a 
  JOIN (SELECT MAX(id) AS id, product_id, MAX(DATE) AS DATE FROM test GROUP BY product_id) AS b 
  ON a.id = b.id AND a.product_id = b.product_id AND a.date = b.date

这次我得到了我想要的结果

    id  product_id    date  
------  ----------  --------
     3           1         3
     6           2         2
     7           3         1

我在添加其他数据时的问题

    id  product_id    date  
------  ----------  --------
     1           1         1
     2           1         2
     3           1         3
     4           2         1
     5           2         2
     6           2         2
     7           3         1
     8           1         3
     9           1         2

并使用相同的查询,结果就像这样

    id  product_id    date  
------  ----------  --------
     6           2         2
     7           3         1

其中值' 1' for product_id?

2 个答案:

答案 0 :(得分:1)

试试这个

SELECT id, product_id, DATE FROM test sitem WHERE product_id IN (1,2,3) AND DATE = (SELECT DATE FROM test WHERE product_id = 
sitem.product_id ORDER BY DATE DESC LIMIT 1) AND id = 
(SELECT id FROM test WHERE product_id = sitem.product_id ORDER BY DATE DESC, 
id DESC LIMIT 1) GROUP BY product_id

答案 1 :(得分:0)

这是你的子查询:

SELECT MAX(id) AS id, product_id, MAX(DATE) AS DATE
FROM test
GROUP BY product_id

它独立计算iddate的最大值。但是,不能保证这两个值在同一记录中。有一些方法可以修复子查询,但它们相当复杂。

相反,我建议使用另一种方法来获取最后一条记录:

SELECT t.*
FROM test t
WHERE NOT EXISTS (SELECT 1
                  FROM test t2
                  WHERE t2.product_id = t.product_id AND
                        (t2.date > t.date OR
                         t2.date = t.date AND t2.id > t.id
                 );

这将每个产品的最后一条记录标识为没有其他记录具有更大日期的记录。并且,如果两个记录具有相同的日期,则没有其他记录具有更大的ID。