如何选择 mysql 表中的倒数第二行,按列分组?

分享于2022年07月17日 group-by mysql sql 问答
【问题标题】:如何选择 mysql 表中的倒数第二行,按列分组?(How can I select the second-to-last rows in a mysql table, grouped by column?)
【发布时间】:2022-01-22 22:51:49
【问题描述】:

结构是:

CREATE TABLE current
(
   id BIGINT NOT NULL AUTO_INCREMENT,
   PRIMARY KEY(id),
   symbol VARCHAR(5),
   UNIQUE (id), INDEX (symbol)
) ENGINE MyISAM;
id symbol
1 A
2 B
3 C
4 C
5 B
6 A
7 C
8 C
9 A
10 B

我正在使用以下

SELECT * 
FROM current
WHERE id
IN 
(
    SELECT MAX(id)
    FROM current
    GROUP BY symbol
)

返回表中的最后一条记录。

id symbol
8 C
9 A
10 B

如何以类似的方式返回倒数第二个结果?

我知道我需要

ORDER BY id DESC LIMIT 1,1

在某个地方,但我的 foo 很弱。

我想回来

id symbol
5 B
6 A
7 C

  • 也许您需要 TOP 2,然后 LIMIT 1 以获得 2 个最佳结果中的第一个。当然,您必须牢记秩序。我不知道数据集,但我认为它对您的逻辑很有用
  • 发布示例数据和预期结果以阐明您想要什么。
  • 想用一个例子来详细说明? mysql 不是我的第一语言。

【解决方案1】:

对于8.0之前的MySql版本,在 WHERE 子句中使用子查询过滤掉每个符号的最大 id ,然后聚合:

SELECT MAX(id) id, symbol
FROM current
WHERE id NOT IN (SELECT MAX(id) FROM current GROUP BY symbol)
GROUP BY symbol
ORDER BY id;

请参阅 demo

  • 这似乎工作得最快,但如果我要向表中添加另一列(例如 TIMESTAMP),则这些列对于 id 和符号是正确的,但 TIMESTAMP 看起来来自第一个行。
  • @weirdbeard 您不能在聚合查询中添加列。即使它运行(大多数数据库甚至不接受它),列值也是任意的。如果你想要其他列,你可以这样做: dbfiddle.uk/…