2011-03-31 156 views
3

是否有一個簡單的方法來改變以下查詢來檢查,看是否有記錄已經存在於今天的日期,如果它使用最新的計數值進行更新。更新,如果記錄已經存在於今天的日期

mysql_query("INSERT INTO daily_record (PageID, count) 
      VALUES (".$array['page_id'].",".$array['count'].")"); 

我要檢查的柱是CURRENT_TIMESTAMP場(record_date - daily_record表的一部分)如果今天的日期存在一個的pageID則需要更新時發生的,而不是一個新的插入。

如果有人能夠幫助這將是驚人的!

+0

是'在同一個表('daily_record')record_date'?你真的是指一個約會是否存在,或者你的意思是如果約會是今天? (除非你清除表格,否則我想它會存在於昨天) – Rudu 2011-03-31 18:22:41

+0

是的record_date是在daily_record中。如果日期是今天,則更新。我仍然需要保持前幾天的歷史記錄...好點... :) – 2011-03-31 18:29:00

回答

1

那麼,如果你建立daily_record表是這樣的:

CREATE TABLE daily_record (
    pageID INT, 
    record_date DATE, 
    count INT, 
    PRIMARY KEY (pageID,record_date), 
     INDEX idxPageID (pageID) 
) 

然後,您可以使用命令:

INSERT INTO daily_record (
    pageID,record_date,`count` 
) VALUES (
    1,'2011-03-31',32 
) ON DUPLICATE KEY UPDATE `count`=32; 

明顯的pageID/record_date/count將由調用代碼提供。這有效地爲給定的計數創建pageID/day的記錄,或者如果pageID/day的記錄已經存在,則它將計數設置爲提供的值。

使用DATE列類型阻止你獲得自由的時間戳,但是這不是對這個表是特別有用的 - 你怎麼描述它的方式 - 因爲你不關心時/分/秒。

這裏的關鍵是由PRIMARY KEY...線創建唯一索引。如果它的唯一性會被插入違反,那麼它的更新可能會發生。

+0

非常聰明!那會做。 – 2011-03-31 18:56:05

+0

BTW我通過'INDEX idxPageID(的pageID)'的假設下,你可能要檢索記錄特定頁面,如果行數比頁面數量大得多(如1000行數據,10頁)這個索引不會蹲下(無論如何都是全表掃描),所以通過一切手段刪除它 - 這不是解決方案所必需的。 – Rudu 2011-03-31 19:02:56

0

盡我所能想出要麼使用selectif ... then來檢查腦幹的時間提前,或先運行update聲明,檢查@@rowcount(受影響的記錄),並做一個insert如果它與0回來)

即第

0

[編輯 - 這是比它似乎在第一,因爲日期的事情有點複雜。]

更新的記錄,你必須得到你想要更新計數,因此需要您先使用SELECT。但是您需要選擇僅用於當前日期的記錄。

讓我們假設你已經完成了今天的代碼來獲得當前的日期爲$。

然後當肯德里克說,

 
$result=mysql_query("SELECT * from daily_record where PageID=\'$array['page_id']\' and date_field BETWEEN '$today'.' 00:00:00' AND '$today'.' 23:59:59'"); 

if (!$result) 
    { mysql_query("INSERT into daliy_record (PageID,count} VALUES (\'$array['page_id']\',\'$array['count']\')"); } 
else 
    {mysql_query("UPDATE daily_record (count) VALUES (\'$array['count']\') where PageID=\'$array['page_id']\' and date_field=\'$result['date_field']\'");}