如何在mysql8数据库中为每个ID选择最后一行?

问题描述

我正在使用MysqL8服务器。拥有这样的表格,并希望为每个good_id接收最后一行。

CREATE TABLE good_states (`ID` int,`good_id` int,`sales` int);
    
INSERT INTO good_states (`id`,`good_id`,`sales`)
VALUES
    (1,25,33),(2,34),(3,24,14),(4,64),(5,53),(6,457),(7,35,96)
;

http://www.sqlfiddle.com/#!9/735bb60/1

查询

SELECT * FROM good_states  WHERE `good_id` IN (25,24) GROUP BY good_id

对于每个good_id,从good_states返回第一行,但是我需要为每个good_id接收最后一行。

3 | 24 | 14
1 | 25 | 33

我想收到这样的东西

6 | 24 | 427
4 | 25 | 64

按ID DESC排序-只是在这里不工作。作为GROUP BY以ASC方式排序。没有GROUP BY可以做我想做的任何事情吗?

解决方法

您可以使用ROW_NUMBER()分析函数:

SELECT * FROM
(
SELECT g.*,ROW_NUMBER() OVER (PARTITION BY good_id ORDER BY id DESC) AS rn
  FROM good_states g  
 WHERE `good_id` IN (25,24) 
) q
WHERE rn = 1

Demo

为了在按ORDER BY id DESC值(good_id)分组的id(PARTITION BY good_id)排序时返回最后一行

,

您可以尝试对由good_id分组的最大id使用内部联接

select g.* from good_states g
inner join (
  SELECT max(id) max_id,good_id 
  FROM good_states 
  group by good_id
) t on t.nax_id = g.id
  order by g.id desc