Birleştirme ve SQLite ile veri ekleme

2 Cevap php

Ben bir cron üzerinde çalışır ve bir API [title (metin), yol (metin), ziyaretçi (tamsayı)] ve bir SQLite veritabanında saklar gelen JSON verileri çeker bir PHP komut dosyası yazıyorum. Çalıştırır her zaman, varolan başlığı görürse, bu yeni ziyaretçiler mevcut ziyaretçilere saymak eklemek gerekir. Eğer değilse, yeni bir satır olarak yeni veri eklemek gerekir.

İşte benim döngüye bir basitleştirilmiş bir bakalım:

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');");

}

Sonra ben yapacağım SELECT ziyaretçiler tarafından sipariş edilen DISTINCT satırlar çekin ve bir dosyaya yazmak bu. UPDATE sorgu bu satırların tüm ziyaretçiler ekler bu yana, tüm dupes olacağı önemli değil. Belli bir zaman aşımından, ben bütün tablo bırakın ve tekrar toplamaya başlar, bu yüzden dosya çok hantal almaz edeceğiz.

Sorun tamamen ayarsız ziyaretçi sayıları yapma döngünün her geçişte özetledi ziyaretçi sayıları ekleyerek olmasıdır. Ama ben sadece birlikte komut çalıştırıldığı her zaman veri eklemek için daha iyi bir yol bulamadı.

2 Cevap

pseudo-code:

 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'])
 }

Belki mi?

dupes kaçının. benzersiz bir anahtar seti ve yerine kendiniz yapıyor INSERT OR REPLACE ... kullanın.

gibi bir şey CREATE UNIQUE INDEX 'title_path' ON topten (title, path). Bu aynı başlık ve yol alanları ile iki kayıtları imkansız hale getirecek. Bir dupe olurdu yani, sadece bir kör yaparsanız INSERT ...., bir çakışma hatası olsun istiyorum.

yani, sadece o ekleme yapmak istiyorum, INSERT OR REPLACE ...., bu ilk herhangi bir benzersiz dizin denetlemek ve bir rekor zaten varsa, o silinir olacaktır kullanın. Tabii tüm atom var (yani diğer süreç kontrol kayıt kaybolur ve yeniden görmezsiniz).