Слияние и добавление данных с SQLite - PullRequest
2 голосов
/ 04 июня 2009

Я пишу сценарий PHP, который выполняется на cron и извлекает данные JSON из API [title (text), path (text), посетителей (integer)] и сохраняет их в базе данных 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 добавляет всех посетителей в эти строки, не имеет значения, что будут все дубликаты. По истечении определенного времени я отброшу всю таблицу и снова начну собирать, чтобы файл не стал слишком громоздким.

Проблема в том, что он добавляет суммированные подсчеты посетителей на каждом проходе цикла, что делает подсчет посетителей совершенно неожиданным. Но я не мог найти лучший способ просто добавлять данные вместе при каждом запуске скрипта.

Ответы [ 2 ]

1 голос
/ 05 июня 2009

псевдо-код:

 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 голосов
/ 05 июня 2009

избегайте дураков. установите уникальный ключ и используйте INSERT OR REPLACE ... вместо того, чтобы делать это самостоятельно.

что-то вроде CREATE UNIQUE INDEX 'title_path' ON topten (title, path). это сделает невозможным создание двух записей с одинаковыми полями заголовка и пути. поэтому, если вы просто сделаете блайнд INSERT ...., вы получите ошибку конфликта, если это будет обман.

так, просто используйте INSERT OR REPLACE ...., это сначала проверит любой уникальный индекс, и если запись уже есть, она будет стерта, а затем выполнит вставку. конечно, все это атомарно (так что при другой проверке процесса запись не исчезнет и не появится снова).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...