2009-06-04 118 views
2

我正在編寫一個PHP腳本,該腳本在cron上運行並從API [標題(文本),路徑(文本),訪問者(整數)]中提取JSON數據並將其存儲在SQLite數據庫中。每次運行時,如果它看到一個現有的標題,它應該將新的訪問者數量添加到現有的訪問者。如果不是,則應該將新數據添加爲新行。使用SQLite合併和添加數據

這裏是我的環路的簡化一下:

foreach($results as $printresults) { 

//this iterates though $title, $path and $visitors 

$existing_visitors = $db->query("SELECT SUM(visitors) FROM topten WHERE 
title='$title'"); 
while ($existing_vis_row = $existing_visitors->fetch(SQLITE_NUM)) { 


$dupe_enter = $db->query("UPDATE topten SET title='$title', path='$path', 
visitors='$existing_vis_row[0]' WHERE title='$title' "); 
    } 

$db->query("INSERT INTO topten (id,title,path,visitors,time) VALUES 
(NULL, '$title', '$path', '$visitors', '$time');"); 

} 

然後,我會做一個SELECT遊客拉下令DISTINCT行,寫這一個文件。由於UPDATE查詢將所有訪問者添加到這些行,因此將無所不能。在某個超時時間,我將放棄整個表格並重新開始收集,所以文件不會太笨重。

問題在於,它會在循環的每一個循環中添加總計訪問者數量,使訪問者完全無法應對。但是我無法找到一種更好的方式來在每次腳本運行時簡單地將數據添加到一起。

回答

1

僞代碼:

for($json_records as $rec){ 
    $row = SELECT visitors FROM topten WHERE title = $rec['title'] 
    if($row) 
     //record exists, add visitors and update 
     $sum_visitors = $row['visitors'] + $rec['visitors'] 
     UPDATE topten SET visitors = $sum_visitors WHERE title = $rec['title'] 
    else 
     //record doesn't exist, insert new 
     INSERT topten (title, visitors) VALUES ($rec['title'], $rec['visitors']) 
} 

也許?

0

避免愚蠢。設置一個獨特的密鑰,並使用INSERT OR REPLACE ...而不是自己做。

東西就像CREATE UNIQUE INDEX 'title_path' ON topten (title, path)。這將使不可能有兩個具有相同標題和路徑字段的記錄。所以,如果你只是做一個盲目的INSERT ....,你會得到一個衝突錯誤,如果它是一個愚蠢的。

所以,只要使用INSERT OR REPLACE ....,這將首先檢查任何唯一的索引,如果已經有一個記錄,它將被刪除,然後它會做插入。當然它全部是原子的(所以其他進程檢查不會看到記錄消失並重新出現)。

+0

你可以把它貶低一點嗎?我對SQL不太好。也刪除了JSON的提及。 – 2009-06-04 21:01:51

相關問題