Toon posts:

[MY-SQL] optimale query??

Pagina: 1
Acties:

Verwijderd

Topicstarter
Op mijn site hou ik voor de toto een algemeen klassement bij, dit klassement wordt berekend door het totaal aantal punten van een gebruiker berekent over alle weken

SELECT gebruikersnaam, sum(punten) AS totaal_punten
FROM toto
GROUP BY gebruikersnaam, totaal_punten
ORDER BY totaal_punten DESC

uitvoer:
Klaas 38
Jan 36
Piet 32

Nu wil ik achter een gebruiker de vorige postitie weergeven en eventueel een pijltje omhoog, omlaag of = teken, een beetje net zo als in de mega top 50.

Nu wil ik dus de positie bereken die de gebruiker de vorige week stond, hoe kan ik dit krachtig doen.

Ik probeer nu het volgende, ik wil op het moment dat ik in de while lus zit van het actuele klassement bij iedere gebruiker de vorige positie berekenen en NIET dus eerst een hele tabel ergens opslaan (dat is mijn backup optie, als dit niet gaat lukken), ik weet dat het moet kunnen, maar het lukt dus net niet

er komt dus zoiezo een regel bij
$max_week = laatste weeknummer;
HAVING wedstrijdnummer < ($max_week -1)
AND gebruikersid = 3

dit is het overzicht van het punten totaal per gebruiker tot vorige week

wie de oplossing weet is volgens mij $geniaal += 2; ;)

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 07-07 11:51
self join (alias) met een WHERE week < dezeweek

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


Verwijderd

Topicstarter
bigtree schreef op 04 July 2003 @ 12:33:
self join (alias) met een WHERE week < dezeweek
even een vraag? een join lukt me wel en gebruik ik regelmatig, maar wat bedoel je met een "self" join?

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

hetzelfde als een join, maar dan niet met een andere tabel, maar met dezelfde (onder een andere naam doorgaans) :)

[ Voor 18% gewijzigd door ACM op 04-07-2003 13:04 ]


Verwijderd

Topicstarter
oh net als een query in een query als
select *
from toto
where id < select * id from toto where gebruiker = 'klaas';

of zo, dit boven zal natuurlijk niet werken maar zoiets bedoel je?

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 07-07 11:51
Had het even getest op een tabelletje, moet je even ombouwen naar jouw situatie:
code:
1
2
3
4
5
SELECT toto.naam, SUM(toto.punten) AS Totaalpunten, 
SUM(toto2.punten) AS Puntentotvandaag FROM `toto`
LEFT JOIN toto as toto2 ON toto.ID = toto2.ID 
AND toto2.Timestamp < CURDATE() 
GROUP BY toto.naam

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Nee

select * from tabela A, tabela B where A.iets = B.iets;

of met een left join oid

Wat bigtree dus helemaal uitschrijft hierboven.

[ Voor 23% gewijzigd door ACM op 04-07-2003 13:15 ]


Verwijderd

iets moet dan username zijn neem ik aan..

Verwijderd

Topicstarter
oke, dat snap ik en dat lukt mij ook wel, maar...

als ik nu een hele lijst resultaten heb zie ik vanzelf, door middel van ORDER BY totaal_punten DESC, welke gebruiker bovenaan staat en ik ga nu vanzelf door naar bijvoorbeeld nummer 5 met behulp van mijn while lus.

Maar ik wil nu niet die hele while lus doorgaan, maar 1 record krijgen waar uit blijkt dat klaas vorige week op nummer 3 stond en dat gaat volgens mij niet met die join lukken, deze join levert een reeks op, in plaats van 1 record

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 07-07 11:51
Verwijderd schreef op 04 July 2003 @ 13:19:
iets moet dan username zijn neem ik aan..
Als dat je primaire sleutel is wel ja. En nog iets. Het totaal aantal punten tot en met vorige week is niet noodzakelijk in dezelfde volgorde als deze week. Je zult dus eerst door je recordset moeten lopen om de ranking van vorige week te moeten bepalen. Pas dan weet je of iemand is gestegen of juist niet.

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


Verwijderd

Topicstarter
bigtree schreef op 04 July 2003 @ 13:40:
[...]
Als dat je primaire sleutel is wel ja. En nog iets. Het totaal aantal punten tot en met vorige week is niet noodzakelijk in dezelfde volgorde als deze week. Je zult dus eerst door je recordset moeten lopen om de ranking van vorige week te moeten bepalen. Pas dan weet je of iemand is gestegen of juist niet.
En dat is nu net juist mijn bedoeling, ik moet op de een of andere manier het aantal punten en de ranking van vorige week van 1 gebruiker zien te achterhalen

tabel:

id;gebruikersnaam;week;punten
1;klaas;1;10
2;piet;1;5
3;henk;1;8
4;klaas;2;3
5;piet;2;9
6;henk;2;2

week 1:
1. klaas 10 ptn
2. henk 8 ptn
3. piet 5 ptn

week 2:
1. piet 19 ptn (3)
2. klaas 13 ptn (1)
3. henk 10 ptn (2)

gewone telling is:
$query = "SELECT id, gebruikersnaam, sum(punten) AS totaal_punten FROM toto GROUP BY totaal_punten DESC";

while($row ...)
{
$query2 = "SELECT ?? FROM toto WHERE week < 2";
}

  • robjanssen
  • Registratie: September 2001
  • Laatst online: 02-08 16:10

robjanssen

Software Developer

Wat je kunt doen is met de tweede query de volledige ranking opvragen van vorige week.
En dan weer met een while lus door deze ranking lopen tot dat de juiste id gevonden hebt, ondertussen hou je met een een tellertje de positie bij, en als je hem gevonden hebt, dan weet je dus of hij gestegen, gezakt of hetzelfde is.

Het is een oplossing, maar het is niet goed voor de performance.
Pagina: 1