2012-04-06 70 views
0

我有兩個MySQL表:統計(左)和消息(右)計數,每天的消息(17個以後計數第二天)

+------------+---------+  +---------+------------+-----------+----------+ 
    | _date  | msgcount|  | msg_id | _date  | time  | message | 
    +------------+---------+  +----------------------+-----------+----------+ 
    | 2011-01-22 | 2  |  | 1  | 2011-01-22 | 06:23:11 | foo bar | 
    | 2011-01-23 | 4  |  | 2  | 2011-01-22 | 15:17:03 | baz  | 
    | 2011-01-24 | 0  |  | 3  | 2011-01-22 | 17:05:45 | foobar | 
    | 2011-01-25 | 1  |  | 4  | 2011-01-22 | 23:58:13 | barbaz | 
    +------------+---------+  | 5  | 2011-01-23 | 00:06:32 | foo foo | 
           | 6  | 2011-01-23 | 13:45:00 | bar foo | 
           | 7  | 2011-01-25 | 02:22:34 | baz baz | 
           +---------+------------+-----------+----------+ 

我填寫stats.msgcount,但在現實中,它仍然是空的。我在尋找一個查詢方式:

  • 計數的郵件數量爲每stats._date(注意在2011-01-25零MSGCOUNT)
  • messages.time是24小時制。 AFTER 5點(17:00:00)所有的消息應該算第二天(通知MSG_ID 3和4計數2011-01-23)
  • 更新stats.msgcount持有所有罪狀

我特別關注「晚於17:00:00第二天計數」部分。 (My)SQL中可能嗎?

回答

3

你可以使用:

UPDATE stats LEFT JOIN 
    (SELECT date(addtime(_date,time) + interval 7 hour) as corrected_date, 
      count(*) as message_count 
    FROM messages 
    GROUP BY corrected_date) mc 
ON stats._date = mc.corrected_date 
SET stats.msgcount = COALESCE(mc.message_count, 0) 

但是這個查詢需要的約會,你有興趣是在統計數據表中已經,如果你沒有他們做出_DATE主要或唯一鍵如果沒有與使用:

INSERT IGNORE INTO stats(_date,msgcount) 
SELECT date(addtime(_date,time) + interval 7 hour) as corrected_date, 
     count(*) as message_count 
FROM messages 
GROUP BY corrected_date 
+0

感謝您的回覆!順便說一句 - 在_date和時間旁邊還有一個帶時間戳的列;那會更有效率嗎? – Pr0no 2012-04-07 09:01:04

+0

只有在列中更正日期才能加快速度 - 然後您可以在該列上使用索引進行分組。如果您仍需要添加7小時或將日期部分作爲時間戳,它不會有太大變化。 – piotrm 2012-04-07 12:52:27

1

真的,你正在做的是將時間轉移7個小時。像這樣的東西應該工作:

UPDATE stats s 
SET count = (SELECT COUNT(msg_id) FROM messages m 
      WHERE m._date BETWEEN DATE_SUB(DATE_ADD(s._date, INTERVAL TIME_TO_SEC(m.time) SECOND), INTERVAL 7 HOUR) 
           AND DATE_ADD(DATE_ADD(s._date, INTERVAL TIME_TO_SEC(m.time) SECOND), INTERVAL 17 HOUR)); 

的基本思想是,它需要每個日期的統計資料表,由7小時調整它,並會在該範圍內發送的消息。如果您使用DATETIME列而不是單獨的DATE和TIME列,則不需要額外的DATE_ADD(...,TIME_TO_SEC)。

可能有更好的方法來添加日期和時間,我沒有看到一個快速查看MySQL參考文檔。

因此,您只需在stats表中插入一個新的行,其中msgcount的值爲0,然後運行update命令。如果你只是想更新幾天(因爲消息計數可能不會在6天后改變),你只需要一個簡單的where子句的更新:

UPDATE stats s 
SET ... 
WHERE s._date BETWEEN '2012-04-03' AND '2012-04-08' 
+0

是的,表格是原樣的。日誌中不會添加(將來)。其次,如果它有幫助,消息表中還有一個時間戳列 - 可能這會使計算更容易? – Pr0no 2012-04-07 09:03:31