[MySQL] Zoeken in MySQL, met weinig inhoud

Pagina: 1
Acties:

  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 12-04 14:05
Ik heb een site gemaakt ( [rml][ ruiltopic] discussie over flexruilen.nl[/rml] ) en zit met een probleem: Hoe voeg ik een zoek functie toe?

Natuurlijk maak ik gebruik van MySQL. Ik heb de volgende pagina gemaakt als testpagina om te zien of het werkt, wat het niet doet (Let op: Het is dus nog geen schoonheidspagina!):

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
<?
if (empty($_GET['soort_ad'])){
    die ('Oeps, geen type gezet...');
}
if (empty($_GET['groepid'])){
    die ('Oeps, geen groep ID gekozen...');
}
if (empty($_GET['rubriekid'])){
    die ('Oeps, geen rubriek ID gekozen...');
}
if (empty($_GET['zoektekst'])){
    #die ('Geen zoekopdracht opgegeven.');
} else {
    $_GET['zoektekst'] = '';
}

$soort_ad = addslashes($_GET['soort_ad']);
$groepid = addslashes($_GET['groepid']);
$rubriekid = addslashes($_GET['rubriekid']);
$zoektekst = addslashes($_GET['zoektekst']);
if (($soort_ad != 'aangeboden') AND ($soort_ad != 'gevraagd')){
    die ('U heeft geen juiste soort advertentie gekozen (aangeboden / gevraagd)');
}
# 
$query_zoek = mysql_query("SELECT * FROM `".$tabel_advertenties."` WHERE
 groep='".$groepid."' AND rubriek='".$rubriekid."' AND type='".$soort_ad."' 
AND titel LIKE '%".$zoektekst."&' ORDER by date DESC");
$rows_zoek = mysql_num_rows($query_zoek); 
if($rows_zoek == 0){
    echo 'Geen artikelen gevonden.';
}
echo '
<table width="600" border="0" cellspacing="0" cellpadding="1">
<tr bgcolor="#FFEC00">
<td width="310">Product</td>
<td width="63">Te ruil</td>
<td width="62">Prijs</td>
<td width="80">Datum</td>
<td width="75">Bekeken</td>
</tr>
';

$tablekleur = 0;
while($disp_zoek = mysql_fetch_array($query_zoek)){
    if (empty($disp_zoek['date'])){
        $geplaatst_op = 'Database error!';
    } else {
        $geplaatst_op = date("d-m-Y", $disp_zoek['date']);
    }
    
    if ($disp_zoek['teruil'] == 0){
        $teruil = '-';
    } else {
        $teruil = 'Ja';
    }
    
    if ($disp_zoek['tekoop'] == 0){
        $tekoop = '-';
    } elseif ($disp_zoek['tekoop'] == 1){
        if ($disp_zoek['prijs'] == 0){
            $tekoop = 'TEAB';
        } else {        
            $tekoop = '&euro; '.$disp_zoek['prijs'];
        }
    }
    
    if ($tablekleur == 0){
        $tablekleur_number = '#F5F5F5';
        $tablekleur++;
    } else {
        $tablekleur_number = '#FFFFFF';
        $tablekleur = 0;
    }
    echo '<tr 
onMouseOver="this.bgColor = \'#E1F9FF\'"
onMouseOut ="this.bgColor = \''.$tablekleur_number.'\'" 
bgcolor="'.$tablekleur_number.'"
onclick="location.href=\'index.php?page=bekijk_advertentie&type='.$soort_ad.'&id='.$disp_zoek['id'].'\'"
style="cursor: pointer">
<td>'.$disp_zoek['titel'].'</td>
<td>'.$teruil.'</td>
<td>'.$tekoop.'</td>
<td>'.$geplaatst_op.'</td>
<td>'.$disp_zoek['bekeken'].'</td></tr>';
}
echo '</table';

?>



Dit om alleen in de titel te zoeken. Ik gebruik hier dus LIKE, maar zag o.a. in de FAQ ook een nieuwere (betere?) manier van zoeken staan. Echter aan die nieuwe manier zitten een paar problemen:
1) Bij 50% van de resultaten wordt 0 teruggegeven. Dit is vervelend. Zoals je ziet gaat het om een advertentie website. Stel, je wilt in de rubriek "netwerken" zoeken naar een "switch". Goede kans dat in die rubriek 70% switches zijn, 10% hubs, en 20% netwerkkaarten. Ik zou dan alsnog wél 70% willen laten weergeven, er is dan immers toch nog 30% uitgefilterd.

Hier vind je het script overigens:
http://www.flexruilen.nl/...briekid=8&zoektekst=sdram

Dit geeft 0 rijen terug. In deze soort zoekfunctie schijnt het dat die ook leeg mag zijn, die "nieuwe" functie moet minimaal 3 karakters hebben.

Om het zoeken te beperkten dacht ik aan het opgeven van bijvoorbeeld LIMIT 50. Ik wil ook meerdere pagina's maken, ik ga nu opzoeken hoe dat in elkaar steekt, ik denk heel simpel. Zo beperkt ik dan alsnog mijn resultaten. Ook beperkt ik ze door te selecteren op type, groep en rubriek. Ik krijg geen fout van mysql, maar zou het dan toch niet mogen, omdat ik niets terugkrijg? RUbriek 8 is bijvoorbeeld geheugen, met 4 rijen, waarin in maar 1 rij het woord "sdram" voorkomt. Waarom krijg ik geen resultaat terug?

edit:
Nog fijne kerst, ik zal pas later vandaag kunnen reageren :)

edit2:
PHPmyadmin doet het ook; het lijkt wel alsof mysql geen LIKE en = tegelijk kan hebben? Ik draai versie 4.0.20 overigens.

O ja, ik heb als tabellen InnoDB. Ik had namelijk gelezen, ik denk op de MySQL site, dat deze crash bestendig waren. Ook zijn ze beter als je iets tegelijk doet ofzo bij het aanpassen van een rij, iig was het nodig bij de database van PowerDNS, m'n DNS server.
Die nieuwe tekstzoekfunctie wil myisam tabellen. Welke tabel kan ik het beste nemen?

[ Voor 52% gewijzigd door pierre-oord op 25-12-2004 13:08 ]

Ondernemer in tech (oud LOQED.com, nu UpToMore.com)


  • LoBbY_1
  • Registratie: Juli 2002
  • Laatst online: 06-01 11:08
probeer eens een full-text-search

http://dev.mysql.com/doc/mysql/en/Fulltext_Search.html

voorbeeldje

PHP:
1
2
3
4
5
6
7
8
9
 //zoek query:
$zoek = mysql_query("SELECT iets
                     from iets
                     WHERE MATCH (feld, feld) AGAINST ('$query') order by iets limit $van,$aant") or die (mysql_error());

while ($inh_zoek= mysql_fetch_array($zoek))
    {
//doe iets
    }

[ Voor 68% gewijzigd door LoBbY_1 op 25-12-2004 16:29 ]

Een echte golver is nooit uitgeput


  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 12-04 14:05
LoBbY_1 schreef op zaterdag 25 december 2004 @ 16:25:
probeer eens een full-text-search

http://dev.mysql.com/doc/mysql/en/Fulltext_Search.html

voorbeeldje

PHP:
1
2
3
4
5
6
7
8
9
 //zoek query:
$zoek = mysql_query("SELECT iets
                     from iets
                     WHERE MATCH (feld, feld) AGAINST ('$query') order by iets limit $van,$aant") or die (mysql_error());

while ($inh_zoek= mysql_fetch_array($zoek))
    {
//doe iets
    }
Zou ik hieraan dan wel extra argumenten kunnen geven, zoals
WHERE type=aangeboden MATCH (feld, feld) AGAINST ('$query') order by iets limit

in die richting?
En ik las dat dat enkel zou kunnen bij MyISAM tables? Welke table raden jullie mij aan?

Ondernemer in tech (oud LOQED.com, nu UpToMore.com)


  • LoBbY_1
  • Registratie: Juli 2002
  • Laatst online: 06-01 11:08
Hmm, dat zou ik zo niet direct weten. Ik zou me kunnen voorstellen dat het dan zoiets word als
PHP:
1
2
3
4
$zoek = mysql_query("SELECT iets 
                     from iets 
                     WHERE MATCH (feld, feld) AGAINST ('$query') 
                     where feld = 'iets' order by iets limit $van,$aantal") or die (mysql_error());


Maar, dat zou je het beste even kunnen proberen

[ Voor 9% gewijzigd door LoBbY_1 op 26-12-2004 11:17 ]

Een echte golver is nooit uitgeput


  • Vold
  • Registratie: September 2001
  • Laatst online: 25-03 21:25
Ik heb het op mijn site (hier een voorbeeld) zo gedaan:
PHP:
1
2
3
4
5
6
$aantal = mysql_num_rows(mysql_query("SELECT * FROM links WHERE MATCH(titel) AGAINST ('$zoekstring')"));
if($aantal == '0') { 
    $like_sql = mysql_query("SELECT * FROM links WHERE titel LIKE '%$zoekstring%' LIMIT $x,$AantalPerPagina");
  $aantal = mysql_num_rows($like_sql);
        if ($aantal > '13000') { $error_msg = "U zoekwoord komt in meer dan 13000 artikelen voor, probeer meer zoektermen te gebruiken, of kies een ander zoekwoord."; } else {
    $error_msg = "Er zijn geen artikelen gevonden die het zoekwoord " . htmlspecialchars(stripslashes($zoekstring)) . " bevatten "; }

Zo pak ik het aan, maar je kan natuurlijk heel simpel het zo aanpassen, dat als je met like wel veel resultaten terugkrijgt, dat je die query gaat gebruiken om gegevens aan de bezoeker door te spelen.

Verwijderd

LoBbY_1 schreef op zaterdag 25 december 2004 @ 16:25:
probeer eens een full-text-search

http://dev.mysql.com/doc/mysql/en/Fulltext_Search.html

voorbeeldje

PHP:
1
2
3
4
5
6
7
8
9
 //zoek query:
$zoek = mysql_query("SELECT iets
                     from iets
                     WHERE MATCH (feld, feld) AGAINST ('$query') order by iets limit $van,$aant") or die (mysql_error());

while ($inh_zoek= mysql_fetch_array($zoek))
    {
//doe iets
    }
Dan heb je zoals hij in zn ts vermeldde nog steeds last van dat als er heel veel resultaten zijn, ze helemaal niet worden weergegeven.. De fulltextsearch geeft volgens mij nl bij meer dan 50 resultaten 0 rows terug.

  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 04-12-2025
PHP:
1
2
3
4
5
if (empty($_GET['zoektekst'])){ 
    #die ('Geen zoekopdracht opgegeven.'); 
} else { 
    $_GET['zoektekst'] = ''; 
}

Als ik het goed begrijp geef je een foutmelding wanneer zoektekst leeg is en wanneer dat niet het geval is maak je hem leeg...

Dus er komt nooit een zoektekst door...

  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 12-04 14:05
Ik moet weg maar even kort:
Ik wil zoeken in database
- Met oneindig veel resultaten
- Ook weergeven bij meer dan 50% match (in tabel met 4 rijen waar 3 matchen wil ik ze ook zien!)
- Ook extra argumenten opgeven. Dat lukt me via phpmyadmin search waar het gewoon invullen is ook niet. Namelijk type moet zijn aangeboden bijvoorbeeld, krijg ik 0 rows terug.

Ondernemer in tech (oud LOQED.com, nu UpToMore.com)


  • LoBbY_1
  • Registratie: Juli 2002
  • Laatst online: 06-01 11:08
Dan heb je zoals hij in zn ts vermeldde nog steeds last van dat als er heel veel resultaten zijn, ze helemaal niet worden weergegeven.. De fulltextsearch geeft volgens mij nl bij meer dan 50 resultaten 0 rows terug.
daar heb ik echt geen last van...ik heb wel tezults van meer als 700, en allemaal vol, en netjes geordend.

Een echte golver is nooit uitgeput


  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 12-04 14:05
LoBbY_1 schreef op zondag 26 december 2004 @ 21:06:
[...]


daar heb ik echt geen last van...ik heb wel tezults van meer als 700, en allemaal vol, en netjes geordend.
Ik ga morgen nog een aantal queries proberen, maar ik kan die ene manier niet gebruiken, omdat het niet vreemd is zoals ik al zei, om meer dan 50% resultaten te krijgen. Zelfs als het 99% is, wil ik de resultaten zien.

Het probleem lijkt vooral te zitten in het combineren van de LIKE en de iets='iets', dat geeft altijd 0 rijen terug. Als ik bijvoorbeeld PHPMyAdmin gebruik, als ik alleen iets=iets invul krijg ik een aantal rijen, als ik alleen like invul krijg ik een aantal rijen, als ik beide invul krijg ik niets.

Het lijkt me zeer inefficient om eerst een LIKE te doen, om daarna in de while iets te zetten als

If ($rij['type'] == aangeboden){
.... weergeven
}

toch?

Ondernemer in tech (oud LOQED.com, nu UpToMore.com)


  • LoBbY_1
  • Registratie: Juli 2002
  • Laatst online: 06-01 11:08
Het leuke van de full-text-search is dat je ook de score kan berekenen van de records die je terug krijgt. Als je dan sorteerd krijg je netjes de meest relevante rows bovenaan zodat de gebruiker minder lang hoeft te zoeken in je gevonden records.

Een echte golver is nooit uitgeput


  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 12-04 14:05
LoBbY_1 schreef op maandag 27 december 2004 @ 13:59:
Het leuke van de full-text-search is dat je ook de score kan berekenen van de records die je terug krijgt. Als je dan sorteerd krijg je netjes de meest relevante rows bovenaan zodat de gebruiker minder lang hoeft te zoeken in je gevonden records.
Dat is natuurlijk wel weer een mooi punt.

Is er niet een manier om de full-text-search meer dan 50% resultaten te laten teruggeven?

Ondernemer in tech (oud LOQED.com, nu UpToMore.com)


  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 12-04 14:05
Ik had een klein typfoutje, en krijg nu eindelijk wat terug. Nu wil ik alleen kijken in de "titel" en in "omschrijving". Als in 1 van beide $zoekterm voorkomt, moet die rij worden meegepikt.

Ik heb nu de volgende query:
PHP:
1
2
3
$query_zoek = mysql_query("SELECT * FROM `".$tabel_advertenties."` WHERE
groep='".$groepid."' AND rubriek='".$rubriekid."' AND type='".$soort_ad."' AND 
`titel` LIKE '%".$zoektekst."%' OR `omschrijving` LIKE '%".$zoektekst."%' ORDER by date DESC");


Klopt deze query?

Ik krijg namelijk teveel terug:
Dit is het adres:
http://www.flexruilen.nl/...rubriekid=10&zoektekst=gb

Daarin zit de code verwerkt zoals eerst gegeven met bovenstaande query.
Je ziet dat je zelfs een serverkast terugkrijgt waarin in de omschrijving GB voorkomt.

Schijnbaar zit mysql de queries dus door de OR los van elkaar
Het hele eerste deel OF omschrijving=%iets%.

Nu wil ik met haakjes werken
PHP:
1
2
3
$query_zoek = mysql_query("SELECT * FROM `".$tabel_advertenties."` WHERE
groep='".$groepid."' AND rubriek='".$rubriekid."' AND type='".$soort_ad."' AND 
(`titel` LIKE '%".$zoektekst."%' OR `omschrijving` LIKE '%".$zoektekst."%')ORDER by date DESC");


Maar nu krijg ik weer te weinig terug geloof ik ;(
Dat komt waarschijnlijk doordat de OR zegt: Of hier, of daar, maar niet allebei. Ik heb dus eigenlijk een AND/OR nodig.

Ik hoop dat iemand er nog uitkomt ;)

De match ga ik toch niet gebruiken, omdat ik wil sorteren op datum, waarbij relevantie dus niet zo belangrijk is. Thx!

[ Voor 12% gewijzigd door pierre-oord op 27-12-2004 15:33 ]

Ondernemer in tech (oud LOQED.com, nu UpToMore.com)


  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 12-04 14:05
Iemand die mij kan helpen aan niet nodige AND ?

Dus:
Ik wil alles weergeven met in kolom 1 BLAAT OF in Kolom 2 BLAAT OF alleen in kolom 1 of alleen in kolom 2.

Een AND zegt allebei, een OR zegt in 1 van de 2 en dus niet allebei. AND OR ??

Ondernemer in tech (oud LOQED.com, nu UpToMore.com)


  • jeroen_t
  • Registratie: Februari 2003
  • Laatst online: 09-09-2023
XOR ?
Logical XOR. Returns NULL if either operand is NULL. For non-NULL operands, evaluates to 1 if an odd number of operands is non-zero, otherwise 0 is returned. mysql> SELECT 1 XOR 1;
-> 0
mysql> SELECT 1 XOR 0;
-> 1
mysql> SELECT 1 XOR NULL;
-> NULL
mysql> SELECT 1 XOR 1 XOR 1;
-> 1

a XOR b is mathematically equal to (a AND (NOT b)) OR ((NOT a) and b). XOR was added in MySQL 4.0.2.
komt van: http://dev.mysql.com/doc/mysql/en/Logical_Operators.html

[ Voor 99% gewijzigd door jeroen_t op 29-12-2004 22:33 ]


Verwijderd

LoBbY_1 schreef op zondag 26 december 2004 @ 21:06:
[...]


daar heb ik echt geen last van...ik heb wel tezults van meer als 700, en allemaal vol, en netjes geordend.
Hmm, als ik nou eens goed had gelezen destijds in de tutorial had ik geweten dat het om 50 procent ging en niet om 50 resultaten ;)
Pagina: 1