webForumDet fria alternativet

Kombinera + Summera tävlingsvärden + SORTERA

Databaser & SQL

3 svar · 445 visningar · startad av backer

Medlem sedan feb. 200924 inlägg
Frågan#1

Hallojse,
fick fin hjälp med hur man kan addera värden rakt i SQL. http://www.webforum.nu/showthread.php?t=173282

columnA + columnB AS nycolumn

Försöker mig på detta samt att slå ihop flera kolumner och sortera men får inte ihop det.

exempel vad jag vill ha ut se nedan, vill t.ex. sortera på totala summan som slår ihop allt.
player list1 list2 summa av listor
1 20 30 50
2 40 20 60

Det som plockas ut är unika användares top poäng från varje lista (en användare kanske inte finns med i alla listor). Sedan vill ja dynamiskt kunna ändra på vilken lista eller totala jag vill sortera på.
e.g.
ORDER BY totalScore DESC
ORDER BY list2 DESC
Verkar funka när jag väljer listorna men totalScore vill sig inte, kan det vara att talen kanske blir 20,30,NULL,30,NULL som den försöker slå ihop?

SELECT h1.playerId,h1.scoreName, 
	(SELECT max(h2.scorePoints) FROM tbl_highscores h2 WHERE h2.scoreListId = 0 AND h2.playerId = h1.playerId) AS list0 ,
	(SELECT max(h3.scorePoints) FROM tbl_highscores h3 WHERE h3.scoreListId = 1 AND h3.playerId = h1.playerId) AS list1 ,
	(SELECT max(h4.scorePoints) FROM tbl_highscores h4 WHERE h4.scoreListId = 2 AND h4.playerId = h1.playerId) AS list2 ,
	(SELECT max(h5.scorePoints) FROM tbl_highscores h5 WHERE h5.scoreListId = 3 AND h5.playerId = h1.playerId) AS list3 ,
	(SELECT max(h6.scorePoints) FROM tbl_highscores h6 WHERE h6.scoreListId = 4 AND h6.playerId = h1.playerId) AS list4 , 
	(SELECT SUM(list0+list1+list2+list3+list4)) AS totalScore 
FROM tbl_highscores h1 
GROUP BY h1.playerId 
ORDER BY totalScore DESC 
LIMIT 0, 10
Medlem sedan dec. 200012 464 inlägg
#2
select playerId,
       scoreName,
       list0,
       list1,
       list2,
       list3,
       list4,
       coalesce(list0,0) + 
       coalesce(list1,0) + 
       coalesce(list2,0) + 
       coalesce(list3,0) + 
       coalesce(list4,0) as totalscore
  from (SELECT h1.playerId,
               h1.scoreName, 
	       (SELECT max(scorePoints) 
                  FROM tbl_highscores 
                 WHERE scoreListId = 0 
                   AND playerId = h1.playerId) AS list0 ,
	       (SELECT max(scorePoints) 
                  FROM tbl_highscores 
                 WHERE scoreListId = 1 
                   AND playerId = h1.playerId) AS list1 ,
	       (SELECT max(scorePoints) 
                  FROM tbl_highscores 
                 WHERE scoreListId = 2 
                   AND playerId = h1.playerId) AS list2 ,
	       (SELECT max(scorePoints) 
                  FROM tbl_highscores 
                 WHERE scoreListId = 3 
                   AND playerId = h1.playerId) AS list3 ,
	       (SELECT max(scorePoints) 
                  FROM tbl_highscores 
                 WHERE scoreListId = 4 
                   AND playerId = h1.playerId) AS list4 
  FROM tbl_highscores h1 
 GROUP BY h1.playerId ) dt
 ORDER BY totalScore DESC 
 LIMIT 0, 10
Medlem sedan feb. 200924 inlägg
#3

Tjoho, tackar & bockar.
Det verkar ju funka suveränt, aldrig sett coalesce() förut.

Så om jag förstår den rätt så använder den värdet från param1, om det är NULL så gå vidare till nästa?

Sedan undrar jag me vad dt gör eller blir från denna raden?
GROUP BY h1.playerId ) dt

Medlem sedan dec. 200012 464 inlägg
#4

Så om jag förstår den rätt så använder den värdet från param1, om det är NULL så gå vidare till nästa?

ja, det stämmer. Man kan ange godtyckligt antal parametrar till coalesce.

Sedan undrar jag me vad dt gör eller blir från denna raden?
GROUP BY h1.playerId ) dt

dt är ett godtyckligt namn som kan användas för att kvalificera kolumner från den inre frågan, t.ex. om det kan bli en konflikt gentemot någon annan tabell. I många fall så behövs inget namn men det måste ändå anges.

259 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)