2011-04-11 222 views
12

我在寫MySQL查詢時遇到了問題。 我在DB獲取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 

以下字段我需要select the last record of each month。 這對於month FEB record # 3month MARCH record # 6month APRIL record # 8

請幫我.....

在此先感謝.....

+2

[我可以在mysql中使用聚合函數(LAST)嗎?](http://stackoverflow.com/questions/5495913/can-i-use-aggregation-function-last-in-mysql) – 2011-04-11 13:23:24

+0

檢查我發佈的答案。我相信它會回答你的問題。 – reggie 2011-04-11 13:38:14

+0

查看http://stackoverflow.com/questions/1379565/mysql-first-and-last-record-of-a-grouped-record-aggregate-functions中接受的答案以獲得更高效的解決方案 – eyaler 2012-06-25 12:45:49

回答

3

建立關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索引,否則該查詢,如果該表變得比幾百行更殺了你的數據庫。

+0

子查詢需要超過10分鐘的時間...我有約。每天28條目..加入查詢有很大的改進..謝謝它的大桌子工作.. – 2012-09-18 07:29:21

+0

有什麼辦法可以將USING換成ON嗎?我使用的框架似乎只使用ON,但我得到了不同的結果 – 2015-12-04 14:57:02

+0

@RobertWent是:http://stackoverflow.com/a/11367066/175303 USING()只是ON()的縮寫,所以前者總是可以擴展到後者。 – Zimzat 2015-12-06 18:48:58

2

首先,您需要按年個月(否則你會在其他年份過濾掉幾個月)。使用MAX()獲取每個組的最大日期。

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

這與最後兩個答案,不會返回預期結果。當對結果進行分組時,MySQL不會爲不在分組中的字段返回預期的行結果。換句話說,如果非分組字段匹配多於一行,則它們是混沌的。 – Zimzat 2011-04-11 13:21:36

+0

http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html使用此功能時,每個組中的所有行應該具有相同的值,以避免從中省略GROUP BY部分。服務器可以自由地返回組中的任何值,所以結果是不確定的,除非所有值都相同。 – Zimzat 2011-04-11 13:52:43

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

謝謝reggie,它的工作..... – Pushpendra 2011-04-11 14:25:32

+1

這應該被重寫,把子查詢放入一個JOIN,否則這會破壞數據庫的表現:http://www.mysqlperformanceblog.com/ 2010/10/25/mysql-limitations-part-3-subqueries/ – Zimzat 2011-04-11 14:34:50

+0

@Zimzat示例代碼請 – user2636556 2016-07-22 13:22:18

2

假設有一天只有一條記錄;

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

即使每天有超過一條記錄,這也可以工作。唯一會失敗的是每秒有多條記錄,特別是本月的最後一秒。根據最高的ID添加一個LEFT JOIN到同一個表中進行選擇將是解決這個問題的方法。 – Zimzat 2011-04-11 13:38:57

+0

噢,我還可以補充說,不建議在'IN'中使用子查詢,因爲它會導致MySQL性能下降。數據庫將爲主表中的每一行運行查詢。將它移入JOIN子查詢會更好。 – Zimzat 2011-04-11 13:40:32

相關問題