尝试每天选择最后一行。
这是我的(简化的,实际表中的更多记录)表:
+-----+-----------------------+------+
| id | datetime | temp |
+-----+-----------------------+------+
| 9 | 2017-06-05 23:55:00 | 9.5 |
| 8 | 2017-06-05 23:50:00 | 9.6 |
| 7 | 2017-06-05 23:45:00 | 9.3 |
| 6 | 2017-06-04 23:55:00 | 9.4 |
| 5 | 2017-06-04 23:50:00 | 9.2 |
| 4 | 2017-06-05 23:45:00 | 9.1 |
| 3 | 2017-06-03 23:55:00 | 9.8 |
| 2 | 2017-06-03 23:50:00 | 9.7 |
| 1 | 2017-06-03 23:45:00 | 9.6 |
+-----+-----------------------+------+
我想选择id = 9,id = 6和id = 3的行。
我试过这个问题:
SELECT MAX(datetime) Stamp
, temp
FROM weatherdata
GROUP
BY YEAR(DateTime)
, MONTH(DateTime)
, DAY(DateTime)
order
by datetime desc
limit 10;
但是datetime和temp不匹配。
亲切的问候
答案 0 :(得分:2)
答案 1 :(得分:0)
如果您的行始终是插入且永不更新,并且id
是自动增量主键,那么
SELECT w.*
FROM weatherdata w
JOIN ( SELECT MAX(id) id
FROM weatherdata
GROUP BY DATE(datetime)
) last ON w.id = last.id
会得到你想要的东西。为什么?内部查询返回id
中每个日期的最大值(表示最近的)weatherdata
值。这确实非常快,特别是如果您在datetime
列上添加索引。
但是,这项工作的条件可能不会成功。如果您的datetime
列有时会更新以更改日期,那么较大的id
值可能并不总是意味着更大的datetime
值。
在这种情况下,你需要这样的东西。
SELECT w.*
FROM weatherdata w
JOIN ( SELECT MAX(datetime) datetime
FROM weatherdata
GROUP BY DATE(datetime)
) last ON w.datetime = last.datetime
您的查询不起作用,因为它滥用了对MySQL GROUP BY的令人讨厌的非标准扩展。阅读:https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
应该正确地使用the ANY_VALUE()
function来强调结果的不可预测性。它应该阅读....
SELECT MAX(datetime) Stamp, ANY_VALUE(temp) temp
这意味着您无法保证正确的行的临时值。相反,它可以从每天的分组中的任何行返回临时值。