[Mysql]Hoe krijg ik uit een record enkel de hoogste waarde

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

  • 456
  • Registratie: April 2000
  • Niet online

456

Onze excuses voor het ongemak

Topicstarter
Ik heb al gesearched, maar al de voor de hand liggende oplossingen hebben tot op heden niet gewerkt. Ik heb een dbase met records, waaronder een score. Ik wil nu ENKEL de hoogste 5 scores zien, maar als bv een user 3keer in die top 5 staat, mag alleen zijn hoogste score te zien zijn.
Met deze query:
code:
1
2
3
4
5
6
SELECT anr, score, attempt
FROM results
WHERE blokid = 1
GROUP BY anr
ORDER BY score DESC 
LIMIT 0 , 5

geeft:
ANR: Score: Attempt:
990868 1 3
894370 0.8 2
990868 0.8 1
649090 0.8 8
649090 0.76 6


krijg ik de hoogste 5 scores te zien. Nu dus nog filteren op die 'anr' (=user):
vb:
code:
1
2
3
4
5
6
SELECT anr, score, attempt
FROM results
WHERE blokid = 1
GROUP BY anr
ORDER BY score DESC 
LIMIT 0 , 5

Ik zou verwchten dat die eerste record van boven (met score 1, wat het hoogste is) dus nu ook het hoogste is, maar wat schetst mijn verbazing:

anr score attempt
294888 0.7 1
649090 0.7 1
894370 0.68 1
990868 0.58 2
303968 0.44 1
Evenzogoed met Distinct gewerkt, of met max(score) en daarna op group by. Niets helpt.
iemand van jullie wel? wat doe ik fout?

Een dag geen vertraging, is een dag niet gereisd


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

SQL:
1
Select Max(scores) as score, anr FROM tabelnaam GROUP BY anr LIMIT 0 , 5

zei je dat niet werkte.. Wat waren daarvan de resultaten?

[ Voor 16% gewijzigd door gorgi_19 op 07-09-2003 17:59 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Eskimootje
  • Registratie: Maart 2002
  • Laatst online: 09:02
SELECT anr, max(score) AS hoogste FROM results WHERE blokid = 1 GROUP BY anr ORDER BY max(score) LIMIT 5

werkt dit ook niet?

  • 456
  • Registratie: April 2000
  • Niet online

456

Onze excuses voor het ongemak

Topicstarter
gorgi_19 schreef op 07 September 2003 @ 17:58:
SQL:
1
Select Max(scores) as score, anr FROM tabelnaam GROUP BY anr LIMIT 0 , 5

zei je dat niet werkte.. Wat waren daarvan de resultaten?
anr score
990868 1
894370 0.800000011920929
649090 0.800000011920929
303968 0.439999997615814
294888 0.740000009536743
(ff een desc bij gevoegd)
Deze waarden kreeg ik eerder ook al, maar intrepeteerde deze meteen als fout toen, gezien de grote waarden die hij retourneerde. In de dbase worden deze niet opgeslagen, int(5) oid een float. Maar ik vermoed toch dat dit de niet afgeronde waarden zijn zoals ze worden opgeslagen!

Kijk echter eens naar de een na laatste waarde (anr = 303968). De vreemde eend in de bijt!

[ Voor 1% gewijzigd door 456 op 07-09-2003 18:54 . Reden: int5 naar float veranderd ]

Een dag geen vertraging, is een dag niet gereisd


  • Limhes
  • Registratie: Oktober 2001
  • Laatst online: 19-08 19:06
Deze 'grote' waarden zijn afgeronde floats. Aangezien een float geen oneindige precisie kan hebben, moet de waarde van de variabele (of veld, wat dan ook) afgebeeld worden op een beschikbaar aantal bytes. Hierdoor krijg je de 'rare' representaties die jij terugkrijgt.

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 21-08 14:03

Robtimus

me Robtimus no like you

Kun je ze niet beter als ints opslaan en dan na ophalen verwerken tot float?

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • 456
  • Registratie: April 2000
  • Niet online

456

Onze excuses voor het ongemak

Topicstarter
Mwa, het is niet zo erg dat ik die grote waarde terug krijg, ik maak daar in php wel een mooie int van. Maar die float zou toch geen invloed moeten hebben op die 'order by score asc' waardoor de laatste 2 waarden worden omgedraaid?

Een dag geen vertraging, is een dag niet gereisd


  • 456
  • Registratie: April 2000
  • Niet online

456

Onze excuses voor het ongemak

Topicstarter
Vraag me niet wat er nu wezenlijk anders is, maar ik heb nu deze query in php ingevoerd (kmoest toch iets) en verdomd, nu zet hij wel alles in de juiste volgorde:
code:
1
2
3
4
5
6
SELECT anr, max(score) as score, attempt 
FROM results 
WHERE blokid = 1 
GROUP BY anr 
ORDER BY score DESC 
LIMIT 0 , 10

:?
Want in weze is het dezelfde query als van gorgi_19.

Of ik heb mijn dag gewoon niet vandaag ;)
Ik ben klaar!

Een dag geen vertraging, is een dag niet gereisd


  • Macros
  • Registratie: Februari 2000
  • Laatst online: 12-08 20:57

Macros

I'm watching...

Ik ben geen uber slimme SQL coder, maar is deze query niet simpler en sneller? Gebruikt geen GROUP BY, dus is ook nog portable naar echte SQL ;)
code:
1
2
3
4
5
SELECT distinct anr, score, attempt 
FROM results 
WHERE blokid = 1 
ORDER BY score DESC 
LIMIT 0 , 10

"Beauty is the ultimate defence against complexity." David Gelernter


  • 456
  • Registratie: April 2000
  • Niet online

456

Onze excuses voor het ongemak

Topicstarter
Macros schreef op 08 september 2003 @ 00:48:
Ik ben geen uber slimme SQL coder, maar is deze query niet simpler en sneller? Gebruikt geen GROUP BY, dus is ook nog portable naar echte SQL ;)
code:
1
2
3
4
5
SELECT distinct anr, score, attempt 
FROM results 
WHERE blokid = 1 
ORDER BY score DESC 
LIMIT 0 , 10
Dit zal niet werken, hij zal nu enkel die waarden weghalen waarbij de gehele rij hetzelfde is, waardoor 1 anr (user) vaker voorkomt in de tabel.

Overigens blies ik met mijn vorige post te hoog van de toren! Op zich geeft hij de juiste user MET de bijbehorende JUISTE score, alleen NIET de daarbij behorende attempt. Het is net alsof de attempt los van de anr met score wordt bijgevoegd.
Dit is al eerder inzichtelijk geweest, maar niemand viel dit op. Bekijk maar eens de output van mijn eerste post (waarbij user 990868 bij attempt 3 de score 1 had)
met de output zoals ik die met deze query krijg
code:
1
2
SELECT anr, max(score) as score, attempt FROM
results GROUP BY anr ORDER BY score DESC LIMIT 0 , 5

:
code:
1
2
3
4
5
6
anr                   score                                attempt
990868                1                                         2 
894370                0.800000011920929          1 
649090                0.800000011920929          1 
111111                0.779999971389771          1 
294888                0.740000009536743          1


Nu zie je dus dat er bij de 1e rij bij attempt 2 staat, terwijl die prestatie pas echt bij attempt 3 is behaald (en attempt 2 heeft derhalve een hele andere score)

[ Voor 4% gewijzigd door 456 op 08-09-2003 15:48 ]

Een dag geen vertraging, is een dag niet gereisd


  • slm
  • Registratie: Januari 2003
  • Laatst online: 25-06 12:45

slm

Je bent dan ook attempt vergeten in je group by clausule. In MySQL mag dit maar geeft vaak vreemde resulaten. Beter is om je in deze aan ANSI SQL te houden.

Neveneffect is dan wel, dat je meerdere keren dezelfde ANR kan tegenkomen, maar ja in een doorsnee highscore lijst is dit ook niet meer dan normaal.

To study and not think is a waste. To think and not study is dangerous.

Pagina: 1