Nasıl bir MySQL tablo ile bir php dizi filtre mi?

6 Cevap php

Ben birkaç yüz girişleri ile $ foo adında bir php dizide dizelerden oluşan bir dizi var, ve ben birkaç bin girdileri ile 'isim' adlı bir alanı olan bir MySQL tablo 'insanlar' var demek. $ Foo hangi dizeleri $ foo her dizesi için bir sorgu vermeden 'insan' bir giriş bir 'isim' değil öğrenmek için etkili bir yol nedir?

Yani $ foo dizeleri zaten girilmiş değil ne öğrenmek istiyorum 'insanlar.'

Bu verilerin her bir noktada bir kutu üzerinde olmak zorunda olacağı açık olduğuna dikkat edin. Amaç sorgu sayısını ve php işleme miktarını en aza indirerek, aynı zamanda bu yapıyor olurdu.

6 Cevap

Ben başka bir tabloda $ foo veri koymak istiyorum ve bir SOL DIŞ isimleriniz tablo ile JOIN yok. Aksi takdirde, bazı noktada yineleme içermeyen bu yapmak için büyük yollardan bir sürü değildir.

Ben geçici bir tablo kullanmadan ile gelebilir en iyisi:

 $list = join(",", $foo);

// fetch all rows of the result of 
// "SELECT name FROM people WHERE name IN($list)" 
// into an array $result

$missing_names = array_diff($foo, $result);

$ Foo kullanıcı girişi varsa ilk kaçtı olurdu unutmayın.

Ne aşağıdaki hakkında:

  1. Get the list of names that are already in the db, using something like: SELECT name FROM people WHERE name IN (imploded list of names)
  2. array_diff() dönüşü her öğe eklemek

SQL'de tamamen yapmak istiyorum:

  1. PHP dizi her isimde bir geçici tablo oluşturun.
  2. Sadece yeni isimler yer alacak ikinci bir geçici tablo doldurmak için bir sorgu gerçekleştirin.
  3. Insanlar tabloya ikinci temp tablosundan bir INSERT ... SELECT yapın.

İkinci seçenek biraz daha hızlı olabilir, ancak ne korkunç hızlı olacaktır.

Birkaç yüz girişler için, sadece array_diff () kullanın veya array_diff_assoc ()

$query = 'SELECT name FROM table WHERE name != '.implode(' OR name != '. $foo);

Hepsi de iyi ölçek istiyorsunuz gibi Yeash, o görünmüyor.

Ben veritabanına tüm dizeleri göndermek için bunun dışında diğer yapmak için daha etkili bir yol olduğundan emin değilim.

Temelde iki seçenek vardır: MySQL tüm dizeleri bir listesini almak ve PHP içine çekmek ve karşılaştırmalar yapmak, ya da MySQL sunucuya tüm dizeleri listesini gönderir ve karşılaştırmalar yapalım. Veritabanında liste PHP liste daha büyük bir küçük olduğu sürece, MySQL, PHP çok daha hızlı karşılaştırmalar yapmak için gidiyor.

Ya geçici bir tablo oluşturmak, ama ya yol senin veritabanına tüm veri bastırıyor.