Kom ihåg mig?
Home Menu

Menu


Smart sql-fråga för poänglista?

Ämnesverktyg Visningsalternativ
Oläst 2006-12-01, 23:21 #1
totoos avatar
totoo totoo är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Nov 2006
Inlägg: 730
totoo totoo är inte uppkopplad
Mycket flitig postare
totoos avatar
 
Reg.datum: Nov 2006
Inlägg: 730
Hallå.

Jag söker en smart metod för att räkna ut vilken plats man ligger på.

Jag har frågat på sweclockers förut, men det dök inte upp något förslag som håller prestandamässigt, så jag gör ett försök till här.

Jag har en tabell med användare och ett antal poäng. Jag vill sedan ha en query som sätter ett fält för respektive användare med den position i poänglistan som han har. Alltså den med högst poäng får en etta, näst högst får en tvåa.

Förut som vi fram till en query som var i stil med.... (skriver pseudo-sql) sätt position=räkna hur många som har mer poäng än mig+1.


Det låter helt realistiskt, men jag tror personligen att den queryn är för seg. Jag har inte klockat den än, sure. Men låt säga att man har 500.000 användare, då ska den där count(*) from users where score > MIN_POÄNG köras sisådär 500.000 ggr? Jag vill nämligen köra denna fråga ganska ofta (gärna varje minut minut eller nåt).

Är den lösningen jag har den bästa, och är den realistisk att använda på ett community löpande hela tiden?
totoo är inte uppkopplad   Svara med citatSvara med citat
Oläst 2006-12-01, 23:37 #2
eg0master eg0master är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2004
Inlägg: 898
eg0master eg0master är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2004
Inlägg: 898
Nu skriver du ju inte vilken databas du använder... Oracle har just det du söker... Men jag antar att du använde MySQL och då finns tyvärr ingen hjälp. Ett alternativ till att köra med en subqueary som gör count(*) 500.000 gånger så [i]kanske[/] du tjänar på att istället ha en "ranking" kollumn som du uppdaterar.

Exempel:
Om du idag har en tabell med kolumnerna id,name,points
Så ändra så den har kolumnerna id,name,points,ranking

"Tillräckligt ofta" kör du sedan ett script som gör:
select id from table order by points DESC
Räkna rad och kör: update table set ranking = row_iterator where id=row_id

Om detta blir snabbare än en gigantisk subquery kan bara tester avgöra, men det är ju ett alternativ som spar prestanda varje gång du skall ha ut rankingsnummer. och med ett index på points bör det gå ganska snabbt att jobba sig igenom alla poster. Företrädelsevis kör du dessutom loopen som en stored procedure om du har möjlighet.
eg0master är inte uppkopplad   Svara med citatSvara med citat
Oläst 2006-12-02, 00:20 #3
totoos avatar
totoo totoo är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Nov 2006
Inlägg: 730
totoo totoo är inte uppkopplad
Mycket flitig postare
totoos avatar
 
Reg.datum: Nov 2006
Inlägg: 730
förlåt, det är mysql ja.

Mm, jag har funderat på din lösning också, jag har som sagt dock inte klockat den, för jag hoppades på att något ännu bättre skulle dyka upp, även om jag egentligen inte trodde på det själv.


Fan vad skönt det hade vart med något sånt här:

update users set position=THIS_UPDATE_ITERATION order by points om du förstår vad jag menar.

Ah, det fanns ingen magisk hjälp på den fronten. Jag får testa när det är dags och göra mätningar, jag ska försöka komma ihåg att berätta vad som var att föredra.
totoo är inte uppkopplad   Svara med citatSvara med citat
Oläst 2006-12-02, 19:03 #4
iXam iXam är inte uppkopplad
Medlem
 
Reg.datum: Aug 2005
Inlägg: 219
iXam iXam är inte uppkopplad
Medlem
 
Reg.datum: Aug 2005
Inlägg: 219
MySQL 5.0.x :
set @rank:=0;
select *,@rank:=@rank+1 as rank from scoretable order by score desc;
iXam är inte uppkopplad   Svara med citatSvara med citat
Oläst 2006-12-03, 18:03 #5
totoos avatar
totoo totoo är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Nov 2006
Inlägg: 730
totoo totoo är inte uppkopplad
Mycket flitig postare
totoos avatar
 
Reg.datum: Nov 2006
Inlägg: 730
tack, men jag har bara mysql4 just nu, men vi kanske kan uppdatera innan tjänsten öppnar. Det där var något helt nytt för mig. Det är alltså en select som även sätter ett värde? Fräna grejer.
totoo är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 20:10.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017