webForumDet fria alternativet

Poängfördelning över flera topplistor

Databaser & SQL

4 svar · 243 visningar · startad av Gein

Medlem sedan sep. 20005 700 inlägg
Frågan#1

Lite osäker på om detta går att åstadkomma med en SQL-fråga eller om jag måste introducera skriptande.
Jag har ett gäng olika topplistor definierade i highscore_types med fälten type, form och handed. Type bestämmer ensamt en rad i tabellen. Själva rekorden ligger i tabellen highscore med fälten uname, type, value och timestamp.
uname säger vem som slagit rekord, type anger vilken topplista och value är rekordet.

Nu skulle jag vilja få ut en "Overall"-topplista där poängfördelningen ser ut som följer:
1: 16p
2: 12p
3: 10p
4: 8p
5: 5p

Svarstabellen ska innehålla uname och poäng. Alternativt, om det är mycket enklare, uname samt antal 1a-, 2a-, 3e-, 4e- och 5e-placeringar.

Kan man göra en sådan utsökning eller måste jag skripta detta? Om det går med SQL, hur ser frågan ut?
(Det gäller MySQL)

Medlem sedan dec. 200012 464 inlägg
#2
select uname,sum(value) pnts
from highscore
group by uname
order by pnts desc
Medlem sedan sep. 20005 700 inlägg
#3

Förlåt, men jag var nog lite otydlig.

Det finns en hel del topplistor och vilken placering man har i topplistan ska avgöra hur mycket poäng man får.

Säg att jag ligger 1:a, 3:a och 3:a (och att det bara finns tre topplistor) då ska jag få
1*16 + 2*10 = 36p.

Value är bara vilket rekord man har i just den topplistan och utifrån den ska man alltså sortera tabellen för att komma fram till placeringarna. Value innehåller ingen poäng, eftersom poängen är tänkt att räknas fram.

Medlem sedan dec. 200012 464 inlägg
#4

Förlåt, men jag var nog lite otydlig.

Lite?

select uname,sum(points) pnts
 from 
   (select uname,
       case 
      (select count(*)
         from high_score
        where value > hs.value
          and type = hs.type
          and uname <> hs.uname)
       when 0 then 16
       when 1 then 10
       else 0 end) pnts
     from highscore hs) dt
Medlem sedan sep. 20005 700 inlägg
#5

LarsG skrev:

Förlåt, men jag var nog lite otydlig.

Lite?

Ehm, ja? Ursäkta.

LarsG skrev:

select uname,sum(points) pnts
 from 
   (select uname,
       case 
      (select count(*)
         from high_score
        where value > hs.value
          and type = hs.type
          and uname <> hs.uname)
       when 0 then 16
       when 1 then 10
       else 0 end) pnts
     from highscore hs) dt

Tack för hjälpen.

260 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
130 ms — deklarationer (db)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)