[SQL] sorteren op uitkomst berekening

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

  • inTIMidate
  • Registratie: September 2001
  • Laatst online: 19-05 00:10
Ik heb een standenlijst met:
- wedstrijden gespeeld
- wedstrijden gewonnen
- percentage gewonnen wedstrijden.

De percentages worden uitgerekend met PHP
PHP:
1
$winstper = substr(($winst / $egespeeld) * 100,0,5);


Maar nu wil ik sorteren op percentage zodat 100% boven komt te staan.

De query waarmee ik nu alle gegevens ophaal:
SQL:
1
2
3
4
5
6
SELECT SUM(t1.winst) as swinst, SUM(t1.verlies) as sverlies, t1.speler_id,
    t1.team_id, t2.voornaam, t2.tussenvoegsel, t2.achternaam
FROM speler_score as t1, spelers as t2
WHERE t1.klasse = '1'
GROUP BY t1.speler_id, t2.id
ORDER BY swinst DESC


Hoe zorg ik ervoor dat de berekening uitgevoerd wordt in de query en de oplossing gebruikt kan worden om op te sorteren?.

.modbreak: heb de layoutverneuking even weggehaald :)

[ Voor 12% gewijzigd door .oisyn op 16-10-2004 16:14 ]


  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 15:42
Het berekenen van het percentage kan zo:

select (winst / gespeeld) as percentage ... (even fictieve velden gebruikt)

Alleen kan je percentage dan niet als argument meegeven in de order by clause voor zover ik weet.

[ Voor 34% gewijzigd door Kwistnix op 16-10-2004 16:23 ]


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Wat voor dbms gebruik je?
Meestal kun je gewoon iets als dit doen:
code:
1
select sum(winst)/count(*) .... order by 1 desc

Who is John Galt?


  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 15:42
justmental schreef op 16 oktober 2004 @ 16:24:
Wat voor dbms gebruik je?
Meestal kun je gewoon iets als dit doen:
code:
1
select sum(winst)/count(*) .... order by 1 desc
Kan je aan je order by clause gewoon een kolomindex meegeven?
Dat wist ik helemaal niet :X
Weer wat geleerd! :)

  • inTIMidate
  • Registratie: September 2001
  • Laatst online: 19-05 00:10
Ik gebruik mysql.

In de order clause meegeven kan wel, doe ik ook met 'swinst'.

Ik ga nu ff verder proberen.

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 15:42
inTIMidate schreef op 16 oktober 2004 @ 16:28:
Ik gebruik mysql.

In de order clause meegeven kan wel, doe ik ook met 'swinst'.

Ik ga nu ff verder proberen.
Oh, MySQL doet daar niet moeilijk over natuurlijk.
Access gaat gelijk lopen zeiken...

  • inTIMidate
  • Registratie: September 2001
  • Laatst online: 19-05 00:10
Ik heb het al werkend.

Zo is me query nu:
code:
1
2
3
4
5
6
7
8
9
10
11
SELECT 
SUM(t1.winst / (t1.winst + t1.verlies)) as percentage, 
SUM(t1.winst) as swinst, SUM(t1.verlies) as sverlies, 
t1.id, t1.speler_id, t1.team_id, t2.voornaam, t2.tussenvoegsel, t2.achternaam 
FROM speler_score as t1, spelers as t2 
WHERE 
t1.klasse = '1' and 
t1.pos = 'ab' and 
t1.speler_id = t2.id 
group by t1.id 
ORDER BY percentage DESC, achternaam, voornaam


Het probleem is nu dat sommige spelers 2x voorkomen, dit komt door die group by, welke ik dus moet gebruiken omdat ik SUM gebruik. Maar deze wil ik niet gebruiken? Kan ik op een of andere manier zorgen dat die groep by niet werkt?

[ Voor 24% gewijzigd door inTIMidate op 16-10-2004 17:11 ]


Verwijderd

Wat er in je database vastgelegd wordt doorzie ik niet zo 1 2 3. Wat wordt er in de tabel speler_score vastgelegd ? bv is dit een wedstrijduitslag o.i.d. ? Staat de andere speler ook in zo'n record ? M.a.w. hoe is/zijn de relatie(s) tussen deze tabel en tabel spelers ? Je kan me helpen met de tabel structuren ;).

  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 22:38

ripexx

bibs

Als je gebruik maakt van aggregated functies zoals (count, sum en avg) zit je gebonden aan group by. In de group by staan alle kolommen die niets van doen hebben met de speciale functie. Als je dna ook nog eens voorwaarden op de group by wil leggen moet je ook nog een having gebruiken.

Gezien je query gebruik je dus MySQL en die doet daar helaas niet moeilijk over maak het kan zeer zeker voor problemen gaan zorgen. Dus hou je zo goed mogelijk aan de standaard. Zie trouwens ook de uitgebreide SQL faq van /14: P&W FAQ - SQL

buit is binnen sukkel


  • inTIMidate
  • Registratie: September 2001
  • Laatst online: 19-05 00:10
In de tabel speler_score worden gegevens van spelers vast gelegd van wedstrijden. Per wedstrijd worden de individuele gegevens van de speler vast gelegd in deze tabel. De spelers zelf zitten in een andere tabel. Ik haal deze ook meteen op zodat als ik goed kan sorteren op percentage ik daarna kan sorteren op achternaam.

  • inTIMidate
  • Registratie: September 2001
  • Laatst online: 19-05 00:10
Ik ben inmiddels weer verder aan het project gegaan maar kom er nog steeds niet uit.

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 13:57

Dido

heforshe

Waarom tel jij percentages op :? Iemand die 50% en 50% heeft, scoort 100% :?

moet SUM(t1.winst / (t1.winst + t1.verlies))
niet zijn SUM(t1.winst) / SUM(t1.winst+ t1.verlies) ?

Als in: 1/2+1/3 is niet hetzelfde als (1+1)/(2+3) :P

[ Voor 17% gewijzigd door Dido op 08-12-2004 14:37 ]

Wat betekent mijn avatar?


Verwijderd

Wat voor dbms gebruik je?
Meestal kun je gewoon iets als dit doen:
code:
1
select sum(winst)/count(*) .... order by 1 desc
[Mierenneuk modus]
Probeer het gebruik van * zoveel mogelijk te vermijden.
Een database moet dan de velden in de tabel gaan bepalen wat extra tijd kost. Gewoon Sum(winst)/count(winst) is dan ook effectiever.
[/Mierenneuk modus]
Het probleem is nu dat sommige spelers 2x voorkomen, dit komt door die group by, welke ik dus moet gebruiken omdat ik SUM gebruik. Maar deze wil ik niet gebruiken? Kan ik op een of andere manier zorgen dat die groep by niet werkt?
Je hebt je tabel structuur er niet bij vermeld maar ik vermoed dat de speler score tabel er ongeveer zo uitziet

ID
SPELERID
WINST
VERLIES
TEAMID

Als je dan groepeert op ID zul je al je records apart terug krijgen groupeer je op speler ID lijkt het goed te kunnen gaan.

[ Voor 6% gewijzigd door Verwijderd op 08-12-2004 15:29 ]


  • inTIMidate
  • Registratie: September 2001
  • Laatst online: 19-05 00:10
Ik heb het inmiddels opgelost op een andere manier, ik geneneer nu de resultaten en zet die in een apparte tabel
Pagina: 1