我有一个包含以下列的数据库表:

id   code   value   datetime   timestamp

在此表中,唯一的唯一值位于id中,即主键.

我想根据datetime值检索此表中最后一组不同的记录.例如,假设下面是我的表格

id   code   value   datetime               timestamp
1    1023   23.56   2011-04-05 14:54:52    1234223421
2    1024   23.56   2011-04-05 14:55:52    1234223423
3    1025   23.56   2011-04-05 14:56:52    1234223424
4    1023   23.56   2011-04-05 14:57:52    1234223425
5    1025   23.56   2011-04-05 14:58:52    1234223426
6    1025   23.56   2011-04-05 14:59:52    1234223427
7    1024   23.56   2011-04-05 15:00:12    1234223428
8    1026   23.56   2011-04-05 15:01:14    1234223429
9    1025   23.56   2011-04-05 15:02:22    1234223430

我想检索ID为4、7、8和9的记录,即具有不同代码的最后一组记录(基于日期时间值).我强调的只是我试图实现的一个例子,因为这个表最终将包含数百万条记录和数百个单独的代码值.

我可以使用什么SQL语句来实现这一点?我似乎无法用一条SQL语句完成它.我的数据库是MySQL 5.

推荐答案

这应该对你有用.

 SELECT * 
 FROM [tableName] 
 WHERE id IN (SELECT MAX(id) FROM [tableName] GROUP BY code)

如果id是自动递增的,就不需要担心datetime的计算成本,因为最近的datetime也会有最高的id.

Update:从性能的Angular 来看,在处理大量记录时,确保对idcode列进行索引.如果id是主键,这是内置的,但您可能需要添加一个覆盖codeid的非聚集索引.

Mysql相关问答推荐

如何在逗号分隔字符串值中使用LEFT函数

Group_CONCAT CASE 乘法输出

Select 同一张表中的结果数?

如何使用等于、喜欢和不等于在 json 字段上编写查询?

Select 最高等级最多的部门名称

在 MySQL 中使用非空条件 LAG() 函数

如何在 mysql 的 group by 子句中 Select 最后创建的记录?

MYSQL 删除两个已知字符串之间的字符串

谁能帮我优化where子句

按年份范围 SQL 查询分组

MYSQL REGEXP_REPLACE 在数字之后

如何在 MYSQL 中使用多个表进行插值

Laravel 查询构建器 where() 用于何时产品必须有多个标签(使用 product_tags 数据透视表多对多)

没有 JDBC 类型的方言映射:1111

在 MySQL 中,我应该 Select 哪种排序规则?

如何使主键从 1000 开始?

MySQL:ALTER IGNORE TABLE 给出违反完整性约束

匹配 IN 子句中的所有值

在 MySQL Workbench 中导出超过 1000 条记录的查询结果

MySQL连接查询使用like?