mysql - 如何从 mySQL 中的 group-by 选择的行中选择一个字段

标签 mysql performance join

我有一个包含 100,000,000 条记录的 GIANT MYSQL 数据库。

简化后,我的三个列是IDdatetime,我有几个关于id 和date 的索引(ID , DATE , ID&DATE ) 所以加入时没有性能问题

 select id, max(date) as last_record from mytable where date < "2010-01-02" 

             mytable
 /--------------------------------\
 |    ID  |     date     |  time  |
 |--------+--------------+--------|
 |    1   | 2009-01-01   |   15   |
 |--------+--------------+--------|
 |    1   | 2009-01-03   |   14   | <-- This 
 |--------+--------------+--------|
 |    2   | 2009-01-01   |   18   |
 |--------+--------------+--------|
 |    2   | 2009-01-02   |   12   |
 |--------+--------------+--------|
 |    2   | 2009-01-02   |   15   | <-- and This 
 \--------+--------------+--------/

结果如下:

 /-----------------------\
 |    ID  |  last_record |
 |--------+--------------|
 |    1   | 2009-01-03   |
 |--------+--------------|
 |    2   | 2009-01-02   |
 \--------+--------------/

改进的问题:现在我希望这个查询告诉我关于按组选择的记录的最大时间,例如:

 /--------------------------------\
 |    ID  |  last_record |  time  |
 |--------+--------------+--------|
 |    1   | 2009-01-03   |   14   |
 |--------+--------------+--------|
 |    2   | 2009-01-02   |   15   |
 \--------+--------------+--------/

我需要一些想法来做到这一点!

编辑:(更多信息)我想知道我所有 ID 的最后一条记录和该记录的时间

最佳答案

SELECT  *
FROM    mytable
WHERE   date <= '2010-01-02'
ORDER BY
        date DESC
LIMIT 1

如果你需要每个date的最大time,使用这个:

SELECT  m.*
FROM    (
        SELECT  DISTINCT date
        FROM    mytable
        ) md
JOIN    mytable m
ON      id =
        (
        SELECT  id
        FROM    mytable mi
        WHERE   mi.date = md.date
        ORDER BY
                mi.date DESC, mi.time DESC, mi.id DESC
        )

您需要一个关于(date, time, id) 的复合索引才能快速运行。

即使您的表是 InnoDB,也应该包含

Id

有关更多详细信息,请参阅我的博客中的此条目:

关于mysql - 如何从 mySQL 中的 group-by 选择的行中选择一个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2132463/

相关文章:

javascript - 为什么我对 PHP 文件的 Angular POST 请求返回 404?

performance - 简单的代码加速

VB.NET 如何提供最佳性能 "Select case"或 IF... ELSEIF ... ELSE... END IF

java - 如何限制 Hibernate 仅生成来自涉及多个实体的 Criteria API 中根实体的列的 SQL 查询

mysql - 如何在nodejs中的sequelize模型mysql中列注释

mysql - Access MySQL 或 Postgres?

mysql - 优化了 3 个表的连接查询

java - 缓冲区大小如何影响 NIO channel 性能?

mysql - SQL子查询逻辑困惑

r - data.table 使用新名称连接(多个)选定的列