2009-06-04 11 views
2

私はcron上で動作し、API [タイトル(テキスト)、パス(テキスト)、訪問者(整数)]からJSONデータを取り出してSQLiteデータベースに保存するPHPスクリプトを作成しています。それが実行されるたびに、既存のタイトルが表示されている場合は、新しい訪問者の数を既存の訪問者に追加する必要があります。そうでない場合は、新しいデータを新しい行として追加する必要があります。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');"); 

} 

その後、私は訪問者が注文したDISTINCT行を引っ張ると、ファイルにこれを書くためにSELECTをやります。 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)のようなものです。同じタイトルとパスのフィールドを持つ2つのレコードを持つことは不可能になります。だから、盲目的にすればINSERT ....、それは偽装であるならば、あなたは競合エラーを起こすだろう。

INSERT OR REPLACE ....を使用すると、一意のインデックスが最初にチェックされ、既にレコードがある場合は消去され、次に挿入が行われます。もちろんそれはすべての原子です(他のプロセスチェックではレコードが消えて再表示されることはありません)。

+0

あなたは私のためにそれをちょっと黙らせることができますか?私はSQLであまり良くはありません。 JSONの言及も削除されました。 –

関連する問題