Hallo,


Ik maak van onderstaande code gebruik maar wil deze nog finetunen/



<?php
$searchwords 	= “spijkerbroek”;
$words 			= explode(" ", $searchwords);
$counter	= count($words);
$query = "SELECT productname FROM products WHERE productname LIKE ‘%words[0]%’";

if($counter > 1){
	for($i=1; $i < $counter; $i++){
		$query .= "UNION SELECT productname FROM products WHERE productname LIKE ‘%words[$i]%’";
	}
}
?>

Stel je hebt deze producten


Spijkerbroek blauw skinny
Spijkerbroek rood
Spijkerbroek


Als je het woord spijkerbroek skinny zoekt dan komt product spijkerbroek rood ook tevoorschijn omdat deze het woord spijkerbroek bevat maar hoe kan ik de producten uitsluiten als er een woord niet matched?

Dus ik zoek op spijkerbroek skinny dan laat alleen spijkerbroek en spijkerbroek skinny zien.
lijkt me niet iets om een union te gebruiken, maar:

... WHERE productname LIKE '%spijkerbroek%' AND productname LIKE '%skinny%';

Dit geeft dus geen spijkerbroeken die niet skinny zijn, maar wel rode skinny sprijkerbroeken.


Maar de eigenschappen apart opslaan en met id's gaan werken, lijkt me een betere benadering die op termijn sneller zal blijken.

zoeken met LIKE zal niet fijn zijn met veel producten:
Je database moet stuk voor stuk alle records af om in de VARCHAR te gaan zoeken of ergens "skinny" staat.
Daar kan hij geen index op aanleggen om snel te kunnnen zoeken.

Maar dat is volgens mij al eens eerder aangegeven
Beste Ivo,



Bedankt voor reactie. Ik heb de UNION inderdaad verwijderd en maakt nu gebruik van AND in de queries.
Momenteel zijn het 11.000 artikelen maar dit gaat natuurlijk nog groeien.
Daarom wil ik het toch voor de toekomst gaan maken en wil daarom graag weten wat ik dan het beste als alternatief kan gebruiken voor LIKE zodat het wel met een INDEX gaat werken?
je zou een lijst met eigenschappen moeten hebben
id eigenschap
1 spijkerbroek
2 schroefrok
3 groen
4 blauw
5 kort
6 lang

en je moet dan een table hebben die die eigenschappen linkt aan een product

prod_id, eigenschap_id
123 1
123 5
123 3

dat betekent dat product 123 dus kennelijk een lange groene spijkerbroek is.

dit heb ik pas nog uitgewerkt in een antwoord hier op phphulp, maar kennelijk niet aan jou dan?
Dus dan zou ik met JOINS moeten werken?
Doet de database zelf dan een INDEX maken op kolommen of moet je dit nog zelf ergens regelen?
Ik snap je voorbeeld wel maar ik denk dag je dit aan iemand anders hebt uitgelegd
Hi Ivo,


Bedankt voor link. Hier heb ik iets aan:)
Maar dan maakt ik toch alsnog gebruik van LIKE in de query?
Dat klopt.
om even het voorbeeld van dat andere topic aan te halen:


SELECT p.product_id, p.naam
FROM products p
JOIN tag_product tp1 ON tp1.product_id = p.product_id AND tp1.tag_id = '99'  -- rood
JOIN tag_product tp2 ON tp2.product_id = p.product_id AND tp2.tag_id = '12'  -- katoen 


je moet op een manier dan die "rood" aan 99 verbinden.
Dat kan op 2 manieren.
mijn voorkeur zou hebben dat je bij het filter id direct plaatst.

bijvoorbeeld

<select id=kleur>
 <option value=99>rood</option> 
 <option value=243>groen</option>
</select>


alternatief zou zijn


SELECT p.product_id, p.naam
FROM products p
JOIN tag_product tp1 ON tp1.product_id = p.product_id 
JOIN tags1 ON tags1.tag_id tp1.tag_id AND tags1.tekst = 'rood'
JOIN tag_product tp2 ON tp2.product_id = p.product_id 
JOIN tags2 ON tags2.tag_id tp2.tag_id AND tags2.tekst = 'katoen'



maar dat lijkt me omslachtiger

Reageren