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

Mysql 查询:获取由另一个值引起的每个成员问题的最后一条记录,mysql,Mysql,例如,我有下面的数据 id product_id date ------ ---------- ---- 1 1 1 2 1 2 3 1 3 4 2 1 5 2 2 6 2 2

例如,我有下面的数据

     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
结果数据查询我想要“每个产品\u 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  
------  ----------  --------
     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  
------  ----------  --------
     3           1         3
     6           2         2
     7           3         1
当我添加另一个数据时,我的问题如下

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  
------  ----------  --------
     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
其中,产品id的值“1”是什么?

这是您的子查询:

SELECT MAX(id) AS id, product_id, MAX(DATE) AS DATE
FROM test
GROUP BY product_id
它独立计算
id
date
的最大值。但是,不能保证这两个值在同一个记录中。有很多方法可以修复子查询,但它们相当复杂

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

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更大。

试试这个

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

您的意思是id=9,product_id=1,date=2?不,id=8,因为最后一个日期是3,您应该在查询“product_id in(1,2,3)AND”中删除此项