betere resultaten LIKE

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Yoeri Achterbergen

Yoeri Achterbergen

28/06/2020 16:58:43
Quote Anchor link
Hallo,


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


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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]%’";
    }
}

?>

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
 
PHP hulp

PHP hulp

28/03/2024 11:56:14
 
Ivo P

Ivo P

28/06/2020 18:34:26
Quote Anchor link
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
 
Yoeri Achterbergen

Yoeri Achterbergen

28/06/2020 22:27:55
Quote Anchor link
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?
 
Ivo P

Ivo P

28/06/2020 22:52:00
Quote Anchor link
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?
 
Yoeri Achterbergen

Yoeri Achterbergen

29/06/2020 00:09:26
Quote Anchor link
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
 
Ivo P

Ivo P

29/06/2020 07:59:59
Quote Anchor link
zie hier: 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
 
Yoeri Achterbergen

Yoeri Achterbergen

29/06/2020 17:19:28
Quote Anchor link
Hi Ivo,


Bedankt voor link. Hier heb ik iets aan:)
Maar dan maakt ik toch alsnog gebruik van LIKE in de query?
 
- Ariën  -
Beheerder

- Ariën -

29/06/2020 17:28:44
Quote Anchor link
Dat klopt.
 
Ivo P

Ivo P

29/06/2020 17:57:13
Quote Anchor link
om even het voorbeeld van dat andere topic aan te halen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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


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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<select id=kleur>
 <option value=99>rood</option>
 <option value=243>groen</option>
</select>


alternatief zou zijn

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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'


maar dat lijkt me omslachtiger
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.