[MySQL] Random records selecteren/winnaars

Pagina: 1
Acties:

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 07:56

alienfruit

the alien you never expected

Topicstarter
Ik heb een tabellen structuur gemaakt voor een quiz, alleen nu wil ik graag MySQL gebruiken om random een paar mensen te selecteren die de meeste score hebben. Nu vroeg ik me af of dit eigenlijk kon, ik zie dat er wel een RAND functie is in MySQL alleen daar krijg je nummer terug tussen 0.0 en 1.0 dus dat volg ik niet helemaal.

Afgezien van dat ik heb de volgende query bedacht om de score op te tellen en de totale score van de speler terug te krijgen

code:
1
2
3
SELECT SUM(a.answer_score), a.answer_id, a.quiz_id from c2m_answers AS a, c2m_player_answers AS pa WHERE
pa.answer_id = a.answer_id AND
pa.player_id = '[b]43[/b]' GROUP BY pa.player_id


Hierbij is 43 de id van de player waarvan je de score terug wilt...

Nu is mijn vraag kan ik in MySQL de score optellen en vervolgens X aantal spelers selecteren die de meeste score hebben?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

nu wil ik graag MySQL gebruiken om random een paar mensen te selecteren die de meeste score hebben
hoe bedoel je dat? Als er een paar mensen zijn met de meeste score, dan is het toch al niet meer random :?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Kix@$$
  • Registratie: December 2001
  • Laatst online: 21-08 15:33
Random nummers zijn meestal tussen de 0 en de 1. Wat je kunt doen (in VB taal):

Int((RAND + 1) * 9)

Zo heb je een heel getal (int rond hem af) van 1 tot met 9.

:)

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 07:56

alienfruit

the alien you never expected

Topicstarter
Nou ik neem aan dat er meer dan n aantal mensen zijn die de hoogste score hebben (maximale score is 10punten) dat betekend dat je alle vragen goed beantwoord hebt. Als ik nu vijf winnaars wil trekken, moet ik dus minstens vijf mensen hebben die alles goed beantwoord hebben. Gezien bij de vorige quiz tussen 400-800 mensen hebben meegedaan moet dit vast wel lukken :)

Verwijderd

verkeerd begrepen .. |:(

[ Voor 70% gewijzigd door Verwijderd op 04-09-2003 15:11 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

Kix@$$ schreef op 04 September 2003 @ 15:09:
Random nummers zijn meestal tussen de 0 en de 1. Wat je kunt doen (in VB taal):

Int((RAND + 1) * 9)

Zo heb je een heel getal (int rond hem af) van 1 tot met 9.

:)
Ik zie het verband met de RAND functie dan ook niet. Let erop dat RAND bij elke row die langsgegaan wordt opnieuw wordt geevalueerd. Iets als SELECT * FROM users WHERE id = RAND * 100 hoeft dan ook niet per se maar 1 iemand uit de 100 mensen te selecteren, en er kan ook net zo goed helemaal niets geretourneerd worden
alienfruit schreef op 04 september 2003 @ 15:10:
Nou ik neem aan dat er meer dan n aantal mensen zijn die de hoogste score hebben (maximale score is 10punten) dat betekend dat je alle vragen goed beantwoord hebt. Als ik nu vijf winnaars wil trekken, moet ik dus minstens vijf mensen hebben die alles goed beantwoord hebben. Gezien bij de vorige quiz tussen 400-800 mensen hebben meegedaan moet dit vast wel lukken :)
oh op die fiets, je hebt dus een x aantal rijen die voldoen aan de query, en daarvan wil je er maar een beperkt aantal hebben, en bovendien random eruit vissen...

je kan natuurlijk een ORDER BY RAND LIMIT 10 erachter zetten, dan worden ze random geordend, en pakt ie de eerste 10. Maar ik vraag me af of dat wel een efficiente query is

kijk mij nou, een database topic :D

[ Voor 70% gewijzigd door .oisyn op 04-09-2003 15:15 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
You can't use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times. From version 3.23 you can do: SELECT * FROM table_name ORDER BY RAND() This is useful to get a random sample of a set SELECT * FROM table1,table2 WHERE a=b AND c<d ORDER BY RAND() LIMIT 1000. Note that a RAND() in a WHERE clause will be re-evaluated every time the WHERE is executed. RAND() is not meant to be a perfect random generator, but instead a fast way to generate ad hoc random numbers that will be portable between platforms for the same MySQL version.
Als jij dus netjes een SELECT * FROM table where score=highScore ORDER BY RAND() LIMIT 0, maxAmount doet, dan heb je van de groep mensen die dezelfde score hebben als highScore @ random maxAmount mensen gepikt.
Bedoel je dat? Je komt nogal vaag over nl :+

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 07:56

alienfruit

the alien you never expected

Topicstarter
Ooh. Ik zal het nog eens proberen :)

Ik heb verschillende tabellen een tabel spelers en een tabel met antwoorden (per antwoord sla ik hier een score op bijv. 0 = fout en 2 is goed) vervolgens heb ik een koppeltabel die een speler koppelt aan een antwoord op een vraag.

Vervolgens heb ik de volgende query die de score ophaalt uit de antwoord tabel en optelt en die score optelt met de gekozen antwoorden van de speler uit de koppeltabel:

code:
1
2
3
SELECT SUM(a.answer_score), a.answer_id, a.quiz_id from c2m_answers AS a, c2m_player_answers AS pa WHERE
pa.answer_id = a.answer_id AND
pa.player_id = '43' GROUP BY pa.player_id


pa.player_id = '43' <-- nu krijg je dus de score van speler met id 43

Wat ik nu wil is dat ik alle mensen terugkrijg met de hoogste score en vervolgens hier uit bijvoorbeeld vijf uit trek die hebben gewonnen. Dit moet toch wel kunnen in SQL/MySQL? Ik heb wel eens gehoord dat je in MySQL een recordset terug kan krijgen en vervolgens die weer opnieuw kan doorlopen om het weer verder uit te sorteren.

[ Voor 12% gewijzigd door alienfruit op 04-09-2003 15:22 ]


  • Eskimootje
  • Registratie: Maart 2002
  • Laatst online: 09:48
Creatieve oplossing: gooi bij iedereen nadat die een quiz gemaakt heeft een random md5hash erbij, vervolgens ordenen op score en md5 hash en voila random mensen.

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 07:56

alienfruit

the alien you never expected

Topicstarter
Ik heb reeds al een hash beschikbaar in de players tabel, het probleem is hoe krijg ik nou een lisjt terug met alle spelers die alle vragen goed hebben beantwoor dik krijg het niet voor elkaar met de query hierboven.

edit:
Maar ja, ik ben ook geen god in databases

  • OkkE
  • Registratie: Oktober 2000
  • Laatst online: 10-11-2025

OkkE

CSS influencer :+

Ik zou een extra veld maken in de players-tabel, met daarin hun score. Kan je heel eenvoudig daar op selecteren, ipv dat geklooi wat je nu moet doen. Of het aantal goede antwoorden opslaan ipv de daadwerkelijke score.

// Edit:

En dan kan je daarna met die boven genoemde query (met RAND()) een willekeurig aantal ophalen.

[ Voor 21% gewijzigd door OkkE op 04-09-2003 16:02 ]

“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

code:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT
  pa.player_id, 
  SUM(a.answer_score) as total_score, 
FROM 
  c2m_answers a,
  c2m_player_answers pa
WHERE
  pa.answer_id = a.answer_id
GROUP BY pa.player_id
HAVING total_score = $maxscore
ORDER BY rand() 
LIMIT 5

Zoiets?

Een variant erop is die HAVING weglaten en dan eerst sorteren op totale score en dan op random, zodat je zeker weet dat je de hoogste waarde hebt, zonder dat perse alles goed moet zijn.

[ Voor 27% gewijzigd door ACM op 04-09-2003 16:09 ]

Pagina: 1