【问题标题】:How to select 1 last row for each id at mysql8 database? [duplicate]如何为mysql 8数据库中的每个id选择最后一行? [复制]
【发布时间】:2020-10-17 14:50:01
【问题描述】:

我正在使用 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, 25, 34),
    (3, 24, 14),
    (4, 25, 64),
    (5, 24, 53),
    (6, 24, 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_states 将每个 good_id 的第一行返回给我,但我需要接收每个 good_id 的最后一行。

3 | 24 | 14
1 | 25 | 33

我想收到这样的东西

6 | 24 | 427
4 | 25 | 64

按 id DESC 订购 - 只是不要在这里工作。作为 GROUP BY 以 ASC 方式排序答案。没有 GROUP by 有什么方法可以做我想做的事吗?

【问题讨论】:

  • 注意demo是5.6版本。您可以使用第 8 版进行调整。

标签: mysql sql select mysql-8.0


【解决方案1】:

你可以使用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

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

【讨论】:

    【解决方案2】:

    您可以尝试在按 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-27
      • 1970-01-01
      • 1970-01-01
      • 2021-01-23
      • 2018-08-18
      • 2020-01-17
      相关资源
      最近更新 更多