FAQ |
Kalender |
2006-12-01, 23:21 | #1 | |||
|
||||
Mycket flitig postare
|
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? |
|||
Svara med citat |
2006-12-01, 23:37 | #2 | ||
|
|||
Mycket flitig postare
|
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. |
||
Svara med citat |
2006-12-02, 00:20 | #3 | |||
|
||||
Mycket flitig postare
|
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. |
|||
Svara med citat |
2006-12-02, 19:03 | #4 | ||
|
|||
Medlem
|
MySQL 5.0.x :
set @rank:=0; select *,@rank:=@rank+1 as rank from scoretable order by score desc; |
||
Svara med citat |
2006-12-03, 18:03 | #5 | |||
|
||||
Mycket flitig postare
|
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.
|
|||
Svara med citat |
Svara |
|
|