我有一个包含 100,000,000 条记录的 GIANT MYSQL 数据库。
简化后,我的三个列是ID、date 和time,我有几个关于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/