在MySQL中获取每个月的最后一条记录....?

17

我在编写MySQL查询时遇到问题。 我的数据库中有以下字段。

id     created_on            status
1      2011-02-15 12:47:09    1 
2      2011-02-24 12:47:09    1
3      2011-02-29 12:47:09    1
4      2011-03-11 12:47:09    1
5      2011-03-15 12:47:09    1
6      2011-03-22 12:47:09    1
7      2011-04-10 12:47:09    1
8      2011-04-11 12:47:09    1

我需要选择每个月的最后一条记录。

也就是选择 二月份的第3条记录三月份的第6条记录四月份的第8条记录

请帮忙......

先行感谢......


2
可能是can i use aggregation function (LAST) in mysql??的重复问题。 - Shakti Singh
请检查我发布的答案。我相信它会回答你的问题。 - reggie
请参考以下链接中的答案,以获得更高效的解决方案:https://dev59.com/H3M_5IYBdhLWcg3wcCrc - o17t H1H' S'k
4个回答

10
SELECT * FROM table 
WHERE created_on in 
(select DISTINCT max(created_on) from table 
GROUP BY YEAR(created_on), MONTH(created_on))

1
这段代码应该重写,将子查询放入JOIN中,否则随着表的增长,这将破坏您的数据库性能:http://www.mysqlperformanceblog.com/2010/10/25/mysql-limitations-part-3-subqueries/ - Zimzat

8

在Dheer的回答基础上:

SELECT r.*
FROM table AS r
    JOIN (
        SELECT MAX(t.created_on) AS created_on
        FROM table AS t
        GROUP BY YEAR(t.created_on), MONTH(t.created_on)
    ) AS x USING (created_on)

请确保在created_on字段上建立索引,否则如果该表中的行数超过几百行,这个查询将会对你的数据库造成巨大压力。


子查询对我来说需要超过10分钟...我每天大约有28个条目..连接查询有很大的改进..谢谢,它适用于大表.. - arulraj.net
有没有办法将USING交换为ON?我使用的框架似乎只使用ON,但是我得到了不同数量的结果。 - Robert Went
@RobertWent 是的:https://dev59.com/iWgu5IYBdhLWcg3wYWFX#11367066 USING() 只是 ON() 的简写形式,因此前者总是可以扩展为后者。 - Zimzat
1
如果我有多个记录具有完全相同的创建时间怎么办?我需要连接仅匹配具有相同时间戳的第一条记录。 - ndru

2

首先,您需要按年份月份分组(否则,您将过滤掉其他年份的月份)。使用MAX()函数获取每个组的最大日期。

SELECT *, MAX(created_on) FROM table
GROUP BY YEAR(created_on), MONTH(created_on) 

1
这个问题和前两个答案一样,不会返回预期的结果。当在结果上进行分组时,MySQL不会为未在分组中的字段返回预期的行结果。换句话说,如果非分组字段匹配多行,则结果是混乱的。 - Zimzat
使用此功能时,每个组中的所有行应具有从GROUP BY部分省略的列的相同值。服务器可以返回组中的任何值,因此除非所有值都相同,否则结果是不确定的。 - Zimzat

2

假设每天只有一条记录;

SELECT * from table where created_on IN (Select MAX(created_on) FROM table
GROUP BY YEAR(created_on), MONTH(created_on) )

即使每天有多条记录,这也能正常工作。唯一会失败的情况是每秒钟有多条记录,特别是在月末的最后一秒。在同一张表上再添加一个LEFT JOIN来选择基于最高ID的记录将是解决此问题的方法。 - Zimzat
哦,我可能还要补充一点,在“IN”中使用子查询并不推荐,因为它会损害MySQL的性能。数据库将为主表中的每一行运行查询。最好将其移入JOIN子查询中。 - Zimzat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接