[SQL][PHP] sorteer en select van woorden

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

Onderwerpen


Acties:
  • 0 Henk 'm!

  • ReLight
  • Registratie: Augustus 2001
  • Laatst online: 27-07 10:47

ReLight

echo("What Now ? !")

Topicstarter
Tbv van een kinder website ben ik bezig aan een script om woordjes te laten zien, 1 voor 1, in alfabetische volgorde, en voor elke letter een woord..

Nu heb ik een tabel (mysql) en de omgeving is php. Nu moet ik in volgorde van alfabet telkens 1 woord tonen en de knop om naar de volgende letter met een bijbehoord woord te gaan.
Zolang ik van elke letter enkel 1 woord in de tabel heb en ook echt voor elke letter een woord erin zou zitten geen probleem. Maar dat is niet zo.
Er zitten bv 5 letters in met begin letter K, en voor de X en Y is er misschien geen woord en moet er dis naar de Z gesprongen worden. Voor de letter K moet er dan random elke keer een ander K-woord genomen worden.

Nu weet ik dat ik dmv SQL een ... WHERE LETTER='A' ORDER BY RAND LIMIT 1 statement kan doen, dit geeft dan maar 1 woord terug gekozen uit alle worden beginnend met een K. (in het acht gebruik ik een SUBSTRING functie).

Ik kom er enkel niet bij hoe ik nu kan gaan detecteren voor de volgende letter dat die er niet is in de lijst (er is bv geen uitspreekbaar dier wiens naam met een X begint) en hoe ik dan achter kan komen in een beetje nette manier welke dan wel de eerst volgende 'gevulde' letter is.

Ik zou dit het liefste of in enkel SQL doen, of echt afhandelen met php.

voorbeeld lijstje:
aap, beer, duif, geit, giraffe, hond, ijsbeer, kip, koe, konijn, krokodil, leeuw, muis

Heeft iemand enige tips ? _/-\o_

Mijn zoon & dochter zijn de toekomst, de rest is tijdsvermaak. Home assistant & & Nibe S2125-12/SMO-S40, RMU-s40 & Tado - Volvo C40 ER, SE


Acties:
  • 0 Henk 'm!

  • Blorgg
  • Registratie: Juni 2001
  • Niet online
Geen idee of dit de netste manier is. Maar je kan een array met daarin alle letters van het alfabet maken. Vervolgens kies je een willekeurig woord uit je DB waarbij je letter een indexwaarde uit je array heeft. Controleer of je een waarde terug krijgt, krijg je dit niet dan verhoog je je indexwaarde met 1 en probeer je het nogmaals. Owja, is je index 25(26e letter) dan zet je hem weer op 0 als je geen resultaat krijgt ;)

[ Voor 4% gewijzigd door Blorgg op 23-05-2005 00:19 ]


Acties:
  • 0 Henk 'm!

  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

In principe kan je natuurlijk selecteren op "WHERE LETTER > A"

en vervolgens sorteren mbv "ORDER BY LETTER, RAND"

waarna je tenslotte je limit er weer in gooit.

Ik weet niet zeker of > een geldige vergelijking is tussen twee letters, maar anders is daar vast iets voor te vinden.

Als er nu wél een letter B is, krijg je een random B, als er géén letter B is, krijg je een random woord van de eerstvolgende letter die er in zit :)

De volgende keer kan je in plaats van A dan de letter gebruiken die je bij de huidige keer terugkrijgt. (Waarschijnlijk B ;))

Wanneer je totaal geen results krijgt, doe je het overnieuw met A.

[ Voor 22% gewijzigd door eamelink op 23-05-2005 00:19 ]


Acties:
  • 0 Henk 'm!

  • Blorgg
  • Registratie: Juni 2001
  • Niet online
Krijg je dan juist niet een willekeurig woord van alle andere woorden die na de A komen? Dus niet alleen B, maar ook C D E enz?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

code:
1
2
3
4
SELECT woord, LEFT(woord, 1) AS letter
FROM woorden
ORDER BY RAND()
GROUP BY letter, woord

Zoiets lijkt me te werken, maar ik heb het niet getest. :P Je zou iig van elke letter die in de DB staat één woord moeten krijgen. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • jan-marten
  • Registratie: September 2000
  • Laatst online: 11:08
PHP:
1
$alfabet = "WHERE username REGEXP '^{$_REQUEST["alfa"]}'";

Heb ik ook ooit eens gebruikt en werkte ook goed. Zoekt alle entry's die beginnen met 'alfa'.

Acties:
  • 0 Henk 'm!

  • ReLight
  • Registratie: Augustus 2001
  • Laatst online: 27-07 10:47

ReLight

echo("What Now ? !")

Topicstarter
-NMe- schreef op maandag 23 mei 2005 @ 00:29:
code:
1
2
3
4
SELECT woord, LEFT(woord, 1) AS letter
FROM woorden
ORDER BY RAND()
GROUP BY letter, woord

Zoiets lijkt me te werken, maar ik heb het niet getest. :P Je zou iig van elke letter die in de DB staat één woord moeten krijgen. :)
Ik zou hier idd dan met een array verder kunnen werken.
enkel hier heeft mysql wat moeite met
"GROUP BY letter,woord"

Mijn zoon & dochter zijn de toekomst, de rest is tijdsvermaak. Home assistant & & Nibe S2125-12/SMO-S40, RMU-s40 & Tado - Volvo C40 ER, SE


Acties:
  • 0 Henk 'm!

  • raoulduke
  • Registratie: Oktober 2003
  • Niet online

raoulduke

Get in!

Je moet denk ik "woord" weghalen uit de GROUP BY clausule. Probleem is dat het eigenlijk geen geldig SQL statement is, maar MySQL pakt het toch. Dat is een groot probleem aan MySQL, maar in dit geval pakt het gelukkig goed uit.

Remember, if you have any trouble you can always send a telegram to the Right People.


Acties:
  • 0 Henk 'm!

  • ReLight
  • Registratie: Augustus 2001
  • Laatst online: 27-07 10:47

ReLight

echo("What Now ? !")

Topicstarter
Hij pikt de combi van ORDER BY RAND() en GROUP BY niet.
Ik moet natuurlijk bij elke run een ander woord b.v. uit de K-woord serie krijgen (anders wordt het snel saai)
Ik krijg nu elke keer de zelfde woorden.

SELECT LEFT(mew_word,1) AS letter, mew_word
FROM mew where mew_dieren='1'
GROUP BY letter

@raouldduke, idd letter is genoeg zo te zien.

Dit wil dus niet:
SELECT LEFT(mew_word,1) AS letter, mew_word
FROM mew where mew_dieren='1'
ORDER BY RAND()
GROUP BY letter

[ Voor 18% gewijzigd door ReLight op 23-05-2005 10:42 ]

Mijn zoon & dochter zijn de toekomst, de rest is tijdsvermaak. Home assistant & & Nibe S2125-12/SMO-S40, RMU-s40 & Tado - Volvo C40 ER, SE


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Als er veel woorden in je tabel zitten zijn de queries met LEFT en de regexp's niet enorm snel, dan is vaak zoiets het snelst:
code:
1
2
SELECT woord FROM tabel WHERE woord >= '$letter' AND woord < '$letter + 1'
ORDER BY rand() LIMIT 1


Met een statement een willekeurig woord per letter, voor elke letter, eruit halen zie ik niet zo gauw lukken in SQL. Ik kan er zo gauw eigenlijk geen enkel statement, met of zonder subquery, voor bedenken die feilloos een willekeurig woord eruit pikt per letter. Wellicht met zoiets:
code:
1
2
3
4
5
6
SELECT letter, woord FROM 
 (
   SELECT LEFT(woord, 1) AS letter, woord, rand() as randomval FROM tabel
   ORDER BY letter, randomval
 ) as virt_tabel 
GROUP BY letter


Btw, order by komt in sql uiteraard na group by.

[ Voor 4% gewijzigd door ACM op 23-05-2005 11:00 ]


Acties:
  • 0 Henk 'm!

  • ReLight
  • Registratie: Augustus 2001
  • Laatst online: 27-07 10:47

ReLight

echo("What Now ? !")

Topicstarter
Met een statement een willekeurig woord per letter, voor elke letter, eruit halen zie ik niet zo gauw lukken in SQL. Ik kan er zo gauw eigenlijk geen enkel statement, met of zonder subquery, voor bedenken die feilloos een willekeurig woord eruit pikt per letter. Wellicht met zoiets:
code:
1
2
3
4
5
6
SELECT letter, woord FROM 
 (
   SELECT LEFT(woord, 1) AS letter, woord, rand() as randomval FROM tabel
   ORDER BY letter, randomval
 ) as virt_tabel 
GROUP BY letter


Btw, order by komt in sql uiteraard na group by.[/quote]

Dit komt inderdaad erg in de buurt, jammer enkel dat je mySQL 4.1+ moet hebben om subqueries met FROM the doen. Heb 4.0.21 hier en op de hosting :(
(http://dev.mysql.com/doc/mysql/en/unnamed-views.html)

Mijn zoon & dochter zijn de toekomst, de rest is tijdsvermaak. Home assistant & & Nibe S2125-12/SMO-S40, RMU-s40 & Tado - Volvo C40 ER, SE


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

raoulduke schreef op maandag 23 mei 2005 @ 10:14:
Je moet denk ik "woord" weghalen uit de GROUP BY clausule. Probleem is dat het eigenlijk geen geldig SQL statement is, maar MySQL pakt het toch. Dat is een groot probleem aan MySQL, maar in dit geval pakt het gelukkig goed uit.
Woord weghalen? Nee hoor, dat sowieso niet. Wanneer je groepeert, dan moet je groeperen uit alle velden uit de select-clausule die niet verwerkt zijn in een aggregate functie. Woord moet dus wel degelijk in de group by staan. ;)

Dat de query niet werkte heeft blijkbaar een andere reden. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1