webForumDet fria alternativet

(poäng + poäng + poäng....) / antal

Databaser & SQL

13 svar · 3 303 visningar · startad av Mr T

Medlem sedan maj 20071 061 inlägg
Frågan#1

En databas där alla poäng anv. ger samlas in för en spec sak:
---------
id
sak_id
point_given
user_id
-------

Vill nu ha reda på hur många som röstat på just denna sak och dess "medel" poäng.
Började tappert med att försöka få ut totala poängen och antal röster men får något fel redan här.

SELECT id, SUM(point_given) AS "tot_point", COUNT(user_id) AS "tot_votes" FROM sak_poang_DB WHERE id=sak_id GROUP BY sak_id

Tacksam för hjälp.

RED (1 ggr): lade in sak_id i tabellen

Medlem sedan juni 20014 290 inlägg
#2

Var finns sak_id någonstans?

Medlem sedan aug. 20039 340 inlägg
#3

Får du några felmeddelanden eller blir värdet fel? Kan du posta ev. felmeddelanden? Har du några null-värden bland point_given? Varför använder du inte funktionen AVG?

Medlem sedan juni 20014 290 inlägg
#4

Man kanske kan skriva den så här:

SELECT user_id, SUM(point_given) AS "tot_point", COUNT(user_id) AS "tot_votes", AVG(point_given) AS "avg_point" FROM sak_poang_DB GROUP BY user_id
Medlem sedan maj 20071 061 inlägg
#5

Ett stort tack för alla inlägg. Nu ska vi se om vi kan få rätsida på allt då jag ser att jag rört till det (redigerat lite). (Man ska inte göra inlägg efter en lång dags slit vid datorn, hur mycket hjälp man än behöver.)

Har följande data i min databas (tabell)

id	sak_id 	user_id	point_given
4	1	4	1
1	2	1	3
2	2	2	4
6	2	3	2
7	2	4	4
8	2	5	2
9	2	6	4
3	3	3	4
5	6	3	4

Kör nu följande rad

SELECT user_id
,SUM(point_given) AS "tot_point"
, COUNT(user_id) AS "tot_votes"
, AVG(point_given) AS "avg_point" 
FROM sak_poang_DB  
WHERE sak_id=2 
GROUP BY user_id

Ger följande resultat :
tot_votes - 1
tot_point - 3
avg_point - 3.0000
mysql_numrows - 6

Dom rätta värdena borde ju vara:
tot_votes - 6
tot_point - 19
avg_point - 3.1667
mysql_numrows - 6

Medlem sedan juni 20014 290 inlägg
#6

Får följande resultat:

+---------+-----------+-----------+-----------+
| user_id | tot_point | tot_votes | avg_point |
+---------+-----------+-----------+-----------+
|       1 |         3 |         1 |    3.0000 |
|       2 |         4 |         1 |    4.0000 |
|       3 |         2 |         1 |    2.0000 |
|       4 |         4 |         1 |    4.0000 |
|       5 |         2 |         1 |    2.0000 |
|       6 |         4 |         1 |    4.0000 |
+---------+-----------+-----------+-----------+

Vilket för mig ser rätt ut.

Du grupperar på user_id och med sak_id=2 så har varje användare bara givit en röst så medel hamnar på ca: 3.1 (19/6)

Medlem sedan aug. 20039 340 inlägg
#7

GunnarD skrev:

Du grupperar på user_id och med sak_id=2 så har varje användare bara givit en röst så medel hamnar på ca: 3.1 (19/6)

Precis! Viktig poäng! Jag misstänker att du bara hämtar en rad från result-setet, och när du grupperar på user_id så får du bara ut värdena från en användare.

Medlem sedan juni 20014 290 inlägg
#8

Satt och testade lite mer, plus att jag läste i första inägget vad du egentligen ville åt:

Med detta SQL uttryck:

SELECT SUM(point_given) AS "tot_point" , COUNT(user_id) AS "tot_votes" , AVG(point_given) AS "avg_point"  FROM sak_poang_DB WHERE sak_id=2  GROUP BY sak_id;

Får jag följande resultat:

+-----------+-----------+-----------+
| tot_point | tot_votes | avg_point |
+-----------+-----------+-----------+
|        19 |         6 |    3.1667 |
+-----------+-----------+-----------+

Tabelen sak_poang_DB ser ut så här:

+----+--------+---------+-------------+
| id | sak_id | user_id | point_given |
+----+--------+---------+-------------+
|  4 |      1 |       4 |           1 |
|  1 |      2 |       1 |           3 |
|  2 |      2 |       2 |           4 |
|  6 |      2 |       3 |           2 |
|  7 |      2 |       4 |           4 |
|  8 |      2 |       5 |           2 |
|  9 |      2 |       6 |           4 |
|  3 |      3 |       3 |           4 |
|  5 |      6 |       3 |           4 |
+----+--------+---------+-------------+
Medlem sedan aug. 20039 340 inlägg
#9

GunnarD, nogräknat så behöver du inte gruppera på sak_id eftersom det bara förekommer rader med ett sak_id i ditt exempel, och aggregat-funktionerna grupperar automatiskt över hela resultat-setet.

Medlem sedan maj 20071 061 inlägg
#10

(Har ingen möjlighet att pröva förrän på fredag)

Gruppe sak_id borde ge mig svaret jag önskar ?

SELECT user_id
, SUM(point_given) AS "tot_point"
, COUNT(user_id) AS "tot_votes"
, AVG(point_given) AS "avg_point" 
FROM sak_poang_DB  
WHERE sak_id=2 
GROUP BY sak_id

Vad jag vill visa är "saken" + poängen och rösterna på en sida.

Medlem sedan aug. 20039 340 inlägg
#11

Mr T, du kan inte selecta user_id eftersom det (potentiellt) finns flera röster av olika personer på ett och samma föremål. Alla rader som har sak_id = 2 slås ju ihop till en rad. Det är ok för SUM, COUNT och AVG, men inte user_id.

Medlem sedan juni 20014 290 inlägg
#12

Mr T skrev:

Vad jag vill visa är "saken" + poängen och rösterna på en sida.

Saken har du satt till 2 i SQL uttrycket, vilket antagligen är en variabel i ditt skrip (php, asp, .net ...) och då har du det där.

Alternativt är att ha med sak_id i uttrycket så får du med det i resultatet (ofarligt eftersom sak_id alltid är samma), men user_id kan du inte ha med av den anledningen som nitro20k1 skriver.

Använder du mitt uttryck i mitt inlägget ovan så får du fram det du vill ha.

Medlem sedan maj 20071 061 inlägg
#13

Tack grabbar.
Naturligtvis är det som ni säger. Trodde jag var tvungen att ha med user_id i Select då jag använde det i min fråga, men naturligtvis är det ju inte så inser jag då jag använder andra saker i min fråga.

Medlem sedan maj 20071 061 inlägg
#14

Tack!

Har nu testat och efter era hjälpsamma inlägg funkar det precis som jag vill. Tack !

288 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
153 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
154 ms — ändringar (db)