Avatar billede stigc Nybegynder
12. april 2001 - 13:53 Der er 20 kommentarer og
2 løsninger

SQL syntaks

Jeg har en tabel bestående af userid\'s og en score. Et userid kan forkomme mange gange grundet flere runder i spillet. Hvordan kan jeg med én SQL sætning summere alle scorene individuelt, så jeg får et recordset bestående af alle id\'er sammen med deres individuelle samlet score?

Hvad er preformance på sådan en?
Avatar billede erikjacobsen Ekspert
12. april 2001 - 13:55 #1
Performance er god nok:

  select userid,sum(score) as score from tabel group by userid
Avatar billede perla Nybegynder
12. april 2001 - 14:03 #2
SELECT id,Sum(score.score) AS SamletScore
FROM Score group by id;
Avatar billede stigc Nybegynder
12. april 2001 - 14:19 #3
Når man nu har masser 15.000+ medlemmer som her på eksperten, så må de have beregnet en samlet score og lagt i samme tabel som userid og username. Eller hvad?
Avatar billede stigc Nybegynder
12. april 2001 - 14:24 #4
og hvis man skal have en order by score på så sådan?

select userid, sum(score) as score from tabel group by userid order by sum(score)

Avatar billede perla Nybegynder
12. april 2001 - 14:24 #5
ja, Mit bud er at de har lavet en Stored Procedure som de kalder. Eventuelt lavet index på userid. begge dele optimerer hjastigheden
Avatar billede perla Nybegynder
12. april 2001 - 14:28 #6
Mangler lige DESC

select userid, sum(score) as score from tabel group by userid order by sum(score) DESC

Avatar billede stigc Nybegynder
12. april 2001 - 14:29 #7
en ting mere:

SELECT avg(score), userid FROM tips WHERE Count(userid)>4 group by userid ORDER BY avg(score)

Jeg vil kun tælle userid med som har over 4 spil i tips-tabellen. Det her virker ikke men hvordan ellers?
   
Avatar billede perla Nybegynder
12. april 2001 - 14:32 #8
Når du har order by skal du bruge \"having\"

SELECT avg(score), userid FROM tips  group by userid ORDER BY avg(score) having Count(userid)>4

Avatar billede stigc Nybegynder
12. april 2001 - 14:40 #9
SQL = \"SELECT avg(score), userid FROM tips group by userid HAVING Count(userid)>4 ORDER BY avg(score)\"

Det er vist pga af SUM man skal bruge Having og orderby skal selvfølgelige til sidst. Mere her:

http://www.w3schools.com/sql/sql_groupby.asp

Men mange tak for hjælpen.

Avatar billede stigc Nybegynder
13. april 2001 - 01:38 #10
Hvad med lidt eksta point?

Jeg vil samtidig lave en join, men kan ikke få den ind uden at den brokker sig! Brugernavn ligger nemlig en anden tabel.

SQL = \"SELECT user.username, avg(tips.score), tips.userid FROM user,tips WHERE user.userid=tips.userid GROUP BY tips.userid HAVING Count(tips.userid)>4 ORDER BY avg(tips.score)\"

Hvad skal jeg gøre?
Avatar billede stigc Nybegynder
13. april 2001 - 01:57 #11
hmm.....

Det her gør det vist:

SQL = \"SELECT user.username, avg(tips.score), tips.userid FROM user,tips WHERE user.userid=tips.userid GROUP BY tips.userid, user.username HAVING Count(tips.userid)>4 ORDER BY avg(tips.score)\"
Avatar billede stigc Nybegynder
13. april 2001 - 01:58 #12
godnat og sov godt!
Avatar billede martinlind Nybegynder
13. april 2001 - 12:52 #13
hvis det er seriøst det du laver, så læs lidt mere i SQL-hjælpen under join\'s og lav dit om til et der altid join\'er som du gerne vil ( inner / outer join ).

/Martin
Avatar billede stigc Nybegynder
13. april 2001 - 13:00 #14
Martinlind>> jeg forstår ikke helt hvad du mener. Men er det noget med de her to SQL sætninger? hvori består forskellen?

SELECT  AVG(tips.score) as avgScore, user.username, tips.userid FROM tips INNER JOIN user ON tips.userid = user.userid GROUP BY tips.userid, user.username HAVING Count(tips.userid)>4 ORDER BY AVG(tips.score) DESC

og

SELECT user.username, avg(tips.score), tips.userid FROM user,tips WHERE user.userid=tips.userid GROUP BY tips.userid, user.username HAVING Count(tips.userid)>4 ORDER BY avg(tips.score) DESC

? ????
Avatar billede perla Nybegynder
13. april 2001 - 13:07 #15
++
Avatar billede perla Nybegynder
13. april 2001 - 13:08 #16
SELECT user.username, avg(tips.score), tips.userid FROM user,tips GROUP BY tips.userid, user.username HAVING Count(tips.userid)>4 AND user.userid=tips.userid ORDER BY avg(tips.score) DESC

Avatar billede martinlind Nybegynder
13. april 2001 - 13:13 #17
forskellen består i mængder og delmænger, og om det skal være inner eller outer join.

Læs Online hjælpen, der står det hele
Avatar billede stigc Nybegynder
13. april 2001 - 13:21 #18
Den her er den eneste der virker:

SELECT  AVG(tips.score) as avgScore, user.username, tips.userid FROM tips INNER JOIN user ON tips.userid = user.userid GROUP BY tips.userid, user.username HAVING Count(tips.userid)>4 ORDER BY AVG(tips.score) DESC

perla>> den her virker hlle ikke:

SELECT user.username, avg(tips.score), tips.userid FROM user,tips GROUP BY tips.userid, user.username HAVING Count(tips.userid)>4 AND user.userid=tips.userid ORDER BY avg(tips.score) DESC
Avatar billede stigc Nybegynder
13. april 2001 - 13:22 #19
ifølge

http://www.w3schools.com/sql/sql_join.asp

er der ikke forskel på innner JOIN og equial JOIN. Jeg kan i hvert tilfælde ikke se den......
Avatar billede erikjacobsen Ekspert
14. april 2001 - 00:09 #20
Må jeg foreslå at du prøver ORDER BY avgScore i stedet for
ORDER BY AVG(tips.score). Måske er SQL-maskinen så dum at
udregne den to gange, og der er (andre) SQL-varianter,
der ikke tillader andet end navne efter en Order By.
Avatar billede stigc Nybegynder
14. april 2001 - 00:13 #21
tak for rådet! Kan du ikke kigge på den her hovr den er en med et ligende problem:

http://www.eksperten.dk/spm/64318
Avatar billede stigc Nybegynder
14. april 2001 - 16:25 #22
kloge hoveder se her:

http://www.eksperten.dk/spm/64499
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester