Ik heb mijn query werkend gemaakt op zoeken van barcode en naam.

Nu Duurt het zeker +-10 seconden voor er resultaat komt.

En bij zoeken op barcode (product_model) laat hij het product 2x zien.
bij zoeken op naam laat hij hem 100x zien.

Kan iemand mij wijzen of ik iets fout doe ?






<?
if(isset($_POST['item_search']) and $_POST['item_search']!='')
{
$search=$_POST['item_search'];
$_SESSION['current_item_search']=$search;
$query="SELECT p.products_id,p.products_model,pd.products_name,p.products_price,tr.tax_rate
FROM
products as p,products_description as pd,tax_rates as tr,tax_class as tc
WHERE
p.products_id=pd.products_id and
p.products_tax_class_id=tc.tax_class_id and
tr.tax_class_id=tc.tax_class_id and
p.products_model like \"%$search%\" or
pd.products_name like \"%$search%\"
and pd.language_id=1
ORDER
by pd.products_name"; }
elseif(isset($_SESSION['current_item_search']))
{
$search=$_SESSION['current_item_search'];
$query="SELECT p.products_id,p.products_model,pd.products_name,p.products_price,tr.tax_rate
FROM
products as p,products_description as pd,tax_rates as tr,tax_class as tc
WHERE
p.products_id=pd.products_id and
p.products_tax_class_id=tc.tax_class_id and
tr.tax_class_id=tc.tax_class_id and
p.products_model like \"%$search%\" or
pd.products_name like \"%$search%\"
and pd.language_id=1
ORDER
by products_description.products_name";

}
else
{
$query="SELECT p.products_id,p.products_model,pd.products_name,p.products_price,tr.tax_rate
FROM
products as p,products_description as pd,tax_rates as tr,tax_class as tc
WHERE
p.products_id=pd.products_id and
p.products_tax_class_id=tc.tax_class_id and
tr.tax_class_id=tc.tax_class_id and pd.language_id=1 ORDER
by pd.products_name";

}
?>
Hmm ik kan niet echt een fout vinden en het werk ook.
En loop je tabellen even na: foreign keys, indexen?
En dan expliciet joinen.
Laten we het dan eens ontleden.
Dit is je WHERE statement in je query, iets overzichtelijker geschreven:
WHERE p.products_id=pd.products_id 
AND p.products_tax_class_id=tc.tax_class_id 
AND tr.tax_class_id=tc.tax_class_id 
AND p.products_model like \"%$search%\"  
OR pd.products_name like \"%$search%\"  
AND pd.language_id=1

Operator precedence bepaalt in welke volgorde operators worden geevalueerd. In dit geval zal de volgorde zijn =, LIKE, AND, OR
de = en LIKE spreken voor zich, het gaat om AND en OR. Om duidelijk te maken wat er nu gaat gebeuren zet ik haakjes om de statements welke als eerste worden bepaald:

WHERE (
  p.products_id=pd.products_id 
  AND p.products_tax_class_id=tc.tax_class_id 
  AND tr.tax_class_id=tc.tax_class_id 
  AND p.products_model like \"%$search%\"  
) OR (
  pd.products_name like \"%$search%\"  
  AND pd.language_id=1
)

Je ziet dus dat alle rijen worden geselecteerd waarvan de id gelijk zijn en waarvan products_model LIKE de search waard is EN alle rijen waarvan de products_name LIKE de searchwaarde en de language gelijk is aan 1.

Iets verteld me dat dat niet is waar je naar op zoek bent. Met andere woorden, je hebt niet gekeken naar in welke volgorde de statements worden geevalueerd.

Nu heb ik 2 tips voor je.
1 - kijk naar operator precendence en daar waar de volgorde niet goed is gebruik haakjes om die statements heen om de juiste volgorde af te dwingen
2 - gebruik expliciete JOINS om je where statement een stuk overzichtelijker te maken. Dus in plaats van "FROM products as p,products_description as pd" doe je
"FROM products as p
LEFT JOIN products_description as pd ON p.products_id=pd.products_id"
Dan kan je namelijk die voorwaarde al uit je WHERE statement halen.
Een expliciete join maakt niet alleen de query overzichtelijker maar ook een stuk sneller. Doe maar eens een explain op de query zoals ie nu is.

Reageren