betere resultaten LIKE
Ik maak van onderstaande code gebruik maar wil deze nog finetunen/
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?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]%’";
}
}
?>
$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.
Gewijzigd op 28/06/2020 16:59:16 door Yoeri Achterbergen
... 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
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?
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?
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
https://www.phphulp.nl/php/forum/topic/mysql-query-in-cache/103599/
Dat gaat over iemand die rode katoenen broeken wil zoeken.
---
Als je zorgt dat er een Foreign Key relatie ligt tussen die tabellen, hoef je niet nog eens apart een index te plaatsen
zie hier: Dat gaat over iemand die rode katoenen broeken wil zoeken.
---
Als je zorgt dat er een Foreign Key relatie ligt tussen die tabellen, hoef je niet nog eens apart een index te plaatsen
Bedankt voor link. Hier heb ik iets aan:)
Maar dan maakt ik toch alsnog gebruik van LIKE in de query?
Dat klopt.
Code (php)
1
2
3
4
2
3
4
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
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
Code (php)
1
2
3
4
2
3
4
<select id=kleur>
<option value=99>rood</option>
<option value=243>groen</option>
</select>
<option value=99>rood</option>
<option value=243>groen</option>
</select>
alternatief zou zijn
Code (php)
1
2
3
4
5
6
2
3
4
5
6
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'
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