Toon posts:

[sql] Moeilijk, alfabet!

Pagina: 1
Acties:
  • 126 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik moet hier een query uitvoeren, die iets te moeilijk is voor mij.

De situatie is als volgt: ik heb een tabel met 1443 ziekten erin. Ik wil nu voor elke letter van het alfabet de eerste ziekte hebben dat met deze letter begint, en de laatste. Uiteindelijk moet er bijvoorbeeld komen te staan:

A: aambeien - azuurblauwe kusten

Omdat het een erg drukke site is, en het allemaal erg snel en met een relatief lage serverload moet, wil ik dit in één query uitvoeren.

Oh ja, ik werk met MySQL en kan dus géén inner joins uitvoeren.

Kan dit in één query? Of anders in twee queries?

Verwijderd

WHERE ziekte = '%a'
ORDER BY ziekte

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Het kan in twee queries echter NIET snel. wil je het snel hebben zal je het moeten gaan cachen en gewoon netjes apart bijhouden wat de eerste en de laatste zijn. Hoef je ook alleen maar te updaten zodra je een ziekte toevoegd of verwijderd. ( en dat kan dan normaal met een trigger... als je die zou hebben :+ )

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Verwijderd

Topicstarter
Op woensdag 05 december 2001 15:32 schreef Gordijnstok het volgende:
WHERE ziekte = '%a'
ORDER BY ziekte
Ik zie niet in waarom hij zou werken. Bedankt voor je reactie hoor, maar... het slaat nergens op ;). Ik heb hem natuurlijk wel even getest, gaf 0 rows terug, i.p.v. de 26 of 52 die ik wil hebben.

  • Darkvater
  • Registratie: Januari 2001
  • Laatst online: 26-08-2024

Darkvater

oh really?

Op woensdag 05 december 2001 15:38 schreef sbesselsen het volgende:

[..]

Ik zie niet in waarom hij zou werken. Bedankt voor je reactie hoor, maar... het slaat nergens op ;). Ik heb hem natuurlijk wel even getest, gaf 0 rows terug, i.p.v. de 26 of 52 die ik wil hebben.
Dat moet het doen hoor: "SELECT ziekte FROM ... WHERE ziekte='%a' ORDER BY ziekte"


Windows Vista? *NEVER* Het waarom - Opera forever!!!
I've seen chickens that were more menacing. Chickens in a coma. On ice. In my fridge


  • GraasGast
  • Registratie: Oktober 2000
  • Laatst online: 03-09 17:11

GraasGast

Analogue Heaven

WHERE ziekte LIKE 'a%'
ORDER BY ziekte LIMIT 1

en dan

WHERE ziekte LIKE 'a%'
ORDER BY ziekte DESC LIMIT 1

lijkt me

Verwijderd

Graasgast: Hij wil graag met 1 query werken. Anders was dat natuurlijk een optie geweest.

Tweede tabel aanmaken inderdaad.

======|=====|=====
Letter|Begin|Einde
A|Aambeien|Azuurblauwe kusten

En dan gewoon SELECT * FROM Overzicht WHERE Letter = 'A'

Bij je insert nieuwe ziekte script vergelijken of de nieuwe ziekte toevallig de eerste of laatste in het alfabet moet is, zo ja automatisch de tabel Overzicht updaten.
Eventueel synchroniseren met je Ziekten tabel (Letter kolom toevoegen ofzo) zodat je ook leuke dingen kan doen met het overzicht.
Suc6 ermee!

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Op woensdag 05 december 2001 15:38 schreef sbesselsen het volgende:

[..]

Ik zie niet in waarom hij zou werken. Bedankt voor je reactie hoor, maar... het slaat nergens op ;). Ik heb hem natuurlijk wel even getest, gaf 0 rows terug, i.p.v. de 26 of 52 die ik wil hebben.
was een tikfoutje neem ik aan,
het moet namelijk a% zijn ipv %a

Verwijderd

Topicstarter
Op woensdag 05 december 2001 15:41 schreef Darkvater het volgende:
Dat moet het doen hoor: "SELECT ziekte FROM ... WHERE ziekte='%a' ORDER BY ziekte"
Uhh... nee. Het %-teken staat sowieso aan de verkeerde kant, daarnaast returnt deze query ALLE records waarbij ziekte met een 'a' begint (resultaat: veel datatraffic), en bovendien doet hij het alléén voor de A. Hij moet het voor alle letters doen.

Verwijderd

Dat moet met LIKE.
code:
1
SELECT watjewilthebben FROM tabelnaam WHERE conditie LIKE '%blaat%'

(zou ik doen)

Verwijderd

Topicstarter
Op woensdag 05 december 2001 15:43 schreef daniel_hoenderdos een heleboel
Het is wel een goede manier zo, maar ik zoek toch een manier om het met één query te kunnen doen. Dat zou het allerbeste zijn. De load voor de MySQL-server is niet zo heel belangrijk, het gaat meer om het dataverkeer tussen de webserver en de MySQL-server.

  • Onno
  • Registratie: Juni 1999
  • Niet online
select substr(ziekte,1,1) as letter,min(ziekte),max(ziekte) from ziekten group by letter order by letter

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Hier moet je gewoon een functie voor schrijven die de boel cacht, dit zijn zaken die waarschijnlijk niet vaak veranderen, maak gewoon een scriptje dat 1 keer per dag de html bakt en include die op de juiste plek.

Verwijderd

/me durft dit bijna niet te zeggen: php het lekker laten uitvogelen...

Selecteer wat je nodig hebt en laat php kijken welke waar moet komen te staan.

edit:
En die sql-code van onno dan? werkt die?

Verwijderd

Excuus het procentteken zat aan de verkeerde kant :P Desondanks horen de acties die je nu wilt doen bij de basisbeginselen van SQL.

  • Onno
  • Registratie: Juni 1999
  • Niet online
Op woensdag 05 december 2001 15:55 schreef daniel_hoenderdos het volgende:
edit:
En die sql-code van Onno dan? werkt die?
Tss. Natuurlijk werkt die. :)

Verwijderd

Okay dan. :D

Verwijderd

Topicstarter
Op woensdag 05 december 2001 15:59 schreef Onno het volgende:

[..]

Tss. Natuurlijk werkt die. :)
Jazeker! Bij mijn eigen SQL deed hij het niet (héél vage MySQL-error) maar bij de server waarop het moet gaan draaien wel. Nog even een paar dingetjes eruit filteren, en het werkt.

Hartstikke bedankt!

[edit]
Uiteindelijk is het deze geworden:
code:
1
select substring(replace(ziekte,'\\\'',''),1,1) letter,min(replace(ziekte,'\\\'','')) minimum, max(replace(ziekte,'\\\'','')) maximum from ziekte group by letter order by letter

Er waren namelijk ook een paar ziekten die met een aanhalingsteken begonnen.

  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025

kvdveer

Z.O.Z.

Onno heeft (natuurlijk) gelijk

Min voor de laagste en MAX voor de hoogste.
Vergeet niet een index te zetten op de kolom waarop je selecteert.

Localhost, sweet localhost


  • Greyfox
  • Registratie: Januari 2001
  • Laatst online: 21:53

Greyfox

MSX rulez

Niet om het een of ander maar is die tabel met ziektes niet relatief statisch?
Dan kun je wellicht 1x per dat een aantal queries draaien die een text-bestandje genereren die je dan in je site gebruikt.
Dan heb je helemaal een lage serverload.

MSX 2 rulez more


  • Tassadar
  • Registratie: September 1999
  • Laatst online: 03-09 22:12

Tassadar

l33t h4x0r :)

Onno is natuurlijk ook een held he, dus was er natuurlijk geen moment twijfel dat het uiteraard gewoon meteen zou werken :)
:P

Verwijderd

Topicstarter
Op woensdag 05 december 2001 16:04 schreef Greyfox het volgende:
Niet om het een of ander maar is die tabel met ziektes niet relatief statisch?
Dan kun je wellicht 1x per dat een aantal queries draaien die een text-bestandje genereren die je dan in je site gebruikt.
Dan heb je helemaal een lage serverload.
Ja, misschien wel. Ik hou alleen niet van cron-jobs, maar ik zal wel even met de opperprogrammeur overleggen. :)

  • Tim
  • Registratie: Mei 2000
  • Laatst online: 23-07 15:18

Tim

Op woensdag 05 december 2001 16:08 schreef Tassadar het volgende:
Onno is in al zijn briljantie anders wel de ; vergeten die 't allemaal mogelijk maakt :)
Hangt er ook maar af waar je de query in moet voeren :)

  • tomato
  • Registratie: November 1999
  • Niet online
Lekker bijdehand die opmerkingen van iedereen, maar ondertussen is Onno weer eens de enige die een antwoord geeft waar iemand iets aan heeft.

dusty heeft ook een punt, het zal zeker in een erg grote tabel (indexen zullen niet eens zoveel uitmaken in MySQL) erg slecht voor je performance zijn.
Pagina: 1