PHP: Bir canavar vs Çoklu SQL sorguları

3 Cevap php

Ben gerçekten korkak kodu var. Ben sorgulamak eklemek filtreleri bir dizi var aşağıda size koddan görebilirsiniz. Sadece o bir dizi sonuçları saklamak veya bu karmaşa var, filtrelerin da kendi seti ile, birden fazla sorgu var Şimdi daha kolay olurdu?

Herkes bu karmaşa daha iyi bir çözüm var mı? Ben anahtar kelime ve madde sayısına göre filtre gerekiyor, ve hangisinin bilmiyorum, çoklu değerleri kullanarak filtre edebilmek gerekiyor.

//Prepare filters and values
$values = array();
$filters = array();
foreach($item_list as $item){
	$filters[] = "ItemNmbr = ?";
	$filters[] = "ItemDesc LIKE ?";
	$filters[] = "NoteText LIKE ?";
	$values[] = $item;
	$values[] = '%' . $item . '%';
	$values[] = '%' . $item . '%';
}
//Prepare the query
$sql = sprintf(
	"SELECT ItemNmbr, ItemDesc, NoteText, Iden, BaseUOM FROM ItemMaster WHERE %s LIMIT 21",
	implode(" OR ", $filters)
);
//Set up the types
$types = str_repeat("s", count($filters));
array_unshift($values, $types);

//Execute it
$state = $mysqli->stmt_init();
$state->prepare($sql) or die ("Could not prepare statement:" . $mysqli->error);
call_user_func_array(array($state, "bind_param"), $values);
$state->bind_result($ItemNmbr, $ItemDesc, $NoteText, $Iden, $BaseUOM);
$state->execute() or die ("Could not execute statement");
$state->store_result();

3 Cevap

I don't see anything particularly monstrous about your query. The only thing I would do different is separate the search terms.

Ie $item_list could be split in numeric items and text items.

o sizin gibi arama bir şey yapabilir:

...WHERE ItemNmbr IN ( number1, number2, number3) OR LIKE .... $text_items go here....

IN çok daha verimli ve $ item_list herhangi bir metin bölümünü içermiyorsa eğer ... o zaman sadece gerçekten hızlı numaraları bir grup arıyor.

Eğer sorgu seviyor çok kullanıyorsanız Şimdi bir sonraki bölümü belki MySQL Full-text Searching kullanmayı düşünmelisiniz.

Cevabı tam olarak neye ihtiyacınız bağlıdır demektir. Sadece 1 sorgusu kullanmanın avantajı, kaynak kullanımının olmasıdır. Bir sorgu sql server ile sadece 1 bağlantısı ve 1 iletişim alır. Ve yapmaya çalışıyorsunuz tam olarak ne ne bağlı olarak, birden fazla 1 tablosunda bunu yapmak için daha az SQL güç alabilir.

Ancak, 1 büyük olandan oluşturmak için daha az gerektiren bir kaç daha az karmaşık SQL ifadeleri kullanmak için bir görüş programcılar açısından daha pratik olabilir. Ultimitaly Bu programlama ve bu çalışması yapmak gerekir, unutmayın. Gerçekten sql işleme vs fark, script işlem yapmak olmayabilir. Sadece daha önemli nihai çağrı yapabilir? Büyük veritabanları ile uğraşırken ben genellikle komut sürecinde Yukarıdaki SQL işleme öneriyoruz.

Tek bir tablo sorgu SQL motoru tarafından önbelleğe alınabilir. MySQL ve tip katıldı tabloları önbelleğe yok. Performans için genel kural sadece gerektiğinde katıldı kullanmaktır. Bu agresif önbellek tablosu indekslere DB motor teşvik ve ayrıca (daha hızlı) nesne veritabanlarına uyum için kod kolaylaştırır - Eğer Amazon / Google bulut hizmetleri kuvvet gibi.