Toon posts:

[MySQL] Bladeren op letter

Pagina: 1
Acties:

Verwijderd

Topicstarter
Stel ik heb een adresboek (of id) waarop ik doe SELECT voornaam, achternaam, ID FROM adressen ORDER BY achternaam;
Nu kan ik dit gemakkelijk over een aantal pagina verdelen door per pagina maar een paar records per keer uit te lezen vanaf een bepaalde offset.
Maar stel dat ik shortcuts A t/m Z wil maken waarmee je gemakkelijk naar de pagina kunt surfen waar de aangeklikte letter begint, wat zou daarvoor een goeie manier zijn?
De hele resultset doorloopen en elke rij in php opvragen om de letter te vinden lijkt me niet de snelste manier :/

  • eborn
  • Registratie: April 2000
  • Laatst online: 20-08 15:45
code:
1
2
3
4
SELECT ID,voornaam,achternaam 
FROM adressen 
WHERE SUBSTRING(achternaam,1,1)='A' 
ORDER BY achternaam

[ Voor 9% gewijzigd door eborn op 23-06-2003 04:38 ]


Verwijderd

SELECT ID,voornaam,achternaam
FROM adressen
WHERE achternaam like 'A%'
ORDER BY achternaam

  • DeverauX
  • Registratie: Februari 2002
  • Niet online

DeverauX

Focus is everything

Indien je een index hebt geplaatst op achternaam kan je beter gebruik maken van het LIKE-statement aangezien MySQL op deze manier gebruik kan maken van een eventuele index op het veld achternaam :)

...whatever was distasteful or unpleasant or uncomfortable or painful - music could always soothe that.
All you have to do is reach out to beauty.
Quincy Jones


  • Snow_King
  • Registratie: April 2001
  • Laatst online: 01:40

Snow_King

Konijn is stoer!

Je zal toch steeds het volgende moeten doen


pagina.php?letter=A
code:
1
2
3
4
SELECT ID,voornaam,achternaam 
FROM adressen 
WHERE achternaam like '$letter%' 
ORDER BY achternaam


en voor iedere letter een eigen link maken, andere manier zie ik niet!

Verwijderd

met Like is idd beste manier door het eventuele gebruik van een index.
Als je ook op '0-9' wil gaan zoeken krijg je:

code:
1
WHERE LEFT( nickname, 1 ) IN (0,1,2,3,....,9)

  • cybermans
  • Registratie: Maart 2001
  • Laatst online: 20-08 08:46
Snow_King schreef op 23 June 2003 @ 08:04:
Je zal toch steeds het volgende moeten doen


pagina.php?letter=A
code:
1
2
3
4
SELECT ID,voornaam,achternaam 
FROM adressen 
WHERE achternaam like '$letter%' 
ORDER BY achternaam


en voor iedere letter een eigen link maken, andere manier zie ik niet!
hoho dat kan natuurlijk niet.
maak daar es snel substr(htmlentities($_GET[letter]),0,1) van. Anders ben je erg onveilig bezig.

Strava | Runkeeper | Endomondo (mijn leikr uploads)


Verwijderd

Wat voor nut heeft het om een htmlentities over 1 karakter heen te halen ?

  • mocean
  • Registratie: November 2000
  • Laatst online: 15-08 04:26
Verwijderd schreef op 23 juni 2003 @ 10:25:
Wat voor nut heeft het om een htmlentities over 1 karakter heen te halen ?
Mensen kunnen er in de querystring veel meer van maken natuurlijk!

En mischien wil je iets bereiken als:
'achternaam LIKE 'a%' OR achternaam LIKE 'A%'

Koop of verkoop je webshop: ecquisition.com


Verwijderd

Ja inderdaad, maar je gebruikt niet de hele querystring, want je gebruikt alleen het eerste karakter van $_GET['letter'], dan hoef je daar echt geen htmlentities over heen te halen, want in 1 karakter kan toch niks staan dat je script onveilig maakt...

(BTW, ik ga er wel van uit dat register_globals uit staat, anders ben je natuurlijk ontzettend onveilig bezig, of je er nou htmlentities overheen haalt of niet...)

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

* drm begrijpt sowieso niet zo goed waarom je htmlentities zou gebruiken als je met mysql aan de slag bent...

[search=escape mysql]

maar imo hoef je helemaal niet te escapen want de definitie is heel eenvoudig: het moet een karakter tussen a en z zijn:
code:
1
2
3
if ( preg_match ( '/^([A-Z])/i', $_GET [ 'letter' ], $match ) ) {
   $letter = $match [ 1 ];
}


In het kader van: controleer je input.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • cybermans
  • Registratie: Maart 2001
  • Laatst online: 20-08 08:46
htmlentities is idd wat overdreven maar het ging uit gewoonte.
* cybermans is gewoon te paranoia

Strava | Runkeeper | Endomondo (mijn leikr uploads)


Verwijderd

Topicstarter
iig bedankt voor de tips, maar het zou natuurlijk het mooiste zijn als ie zegmaar bij 20 namen op een pagina na 7 A's nog 13 B's zou neerzetten.
Zoiezo heb ik voor andere onderdelen van het script al de hele tabel gesorteerd op achternaam in een $result zitten. (0.20 seconde in het ergste geval, vond ik wel acceptabel)
Zodra ik de offset weet waar de letter voor het eerst voorkomt kan ik dit heel makkelijk in mn pagina-verdeel functie invoeren.

Verwijderd

Topicstarter
Opzich krijg ik net een best goed idee
Omdat er toch 20 adressen op een pagina staan, hoef ik alleen maar naar het eerste achternaam op de volgende pagina te kijken. Als deze achternaam dan met een E of F (of hoger) begint, stond de eerste E zeker op vorige pagina :+ Zo hoef ik maar om de 20 records een achternaam op te vragen tot ik de goeie pagina gevonden heb. Iemand hier nog een reactie op?
edit:
ff verduidelijkt

[ Voor 28% gewijzigd door Verwijderd op 23-06-2003 18:04 ]


  • eborn
  • Registratie: April 2000
  • Laatst online: 20-08 15:45
Verwijderd schreef op 23 June 2003 @ 15:39:
Opzich krijg ik net een best goed idee
Omdat er toch 20 adressen op een pagina staan, hoef ik alleen maar naar het eerste adres van de volgende pagina te kijken. Als deze dan met een letter begint die hoger is dan de gezochte letter, begon deze op de vorige pagina :+ Zo hoef ik maar om de 20 records op te vragen. Iemand hier nog een reactie op?
Ik snap misschien niet helemaal wat je nou precies wilt. Maar kun je dit niet beter gewoon oplossen met een simpele LIMIT?

Verwijderd

Topicstarter
Je kunt LIMIT niet gebruiken als je een hele tabel wil sorteren. Met bv LIMIT 20 selecteerd MySQL de eerste 20 records die hij tegenkomt en sorteerd deze.

  • eborn
  • Registratie: April 2000
  • Laatst online: 20-08 15:45
Verwijderd schreef op 23 juni 2003 @ 17:54:
Je kunt LIMIT niet gebruiken als je een hele tabel wil sorteren. Met bv LIMIT 20 selecteerd MySQL de eerste 20 records die hij tegenkomt en sorteerd deze.
Euh :? Ik dacht toch van niet ;) Hij sorteert eerst de tabel en dan krijg je vervolgens een bepaalde range terug. Die range geef je op met de LIMIT.

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

eborn schreef op 23 June 2003 @ 20:25:
[...]
Euh :? Ik dacht toch van niet ;) Hij sorteert eerst de tabel en dan krijg je vervolgens een bepaalde range terug. Die range geef je op met de LIMIT.
klopt, maar dan moet je in dit geval wel weten hoeveel records er met die letter beginnen :P

Verwijderd

Topicstarter
eborn schreef op 23 juni 2003 @ 20:25:
[...]
Euh :? Ik dacht toch van niet ;) Hij sorteert eerst de tabel en dan krijg je vervolgens een bepaalde range terug. Die range geef je op met de LIMIT.
5.2.8 How MySQL Optimises LIMIT

If you use LIMIT # with ORDER BY, MySQL will end the sorting as soon as it has found the first # lines instead of sorting the whole table.
Maar na wat testen, met en zonder indices, blijk je toch gelijk te hebben...
Wat een vreselijke fout van me |:( Dit soort queries zijn klaar in 0.00 sec
Pagina: 1