Avatar billede 7th Praktikant
15. juni 2004 - 16:57 Der er 10 kommentarer og
2 løsninger

GROUP BY og SUM problem

Jeg prøver på at lave en SUM() af antal stemmer, og samtidig udtrække andre felter fra databasen, så jeg kan skyde det hele af i en while-sætning. Det virker dog ikke efter hensigten.

poll indeholder id, option og votes.

Når jeg så prøver...
SELECT * , SUM(votes) AS total FROM poll GROUP BY 'option'
og siger...
$row['votes'] / $row['total'] * 100
så giver det 100, da total er lig med votes, hvilket ikke er meningen.

Hvad gør jeg galt eller har misforstået?
Avatar billede terry Ekspert
15. juni 2004 - 17:09 #1
remove * (all fields)
Avatar billede jakobclausen Nybegynder
15. juni 2004 - 17:17 #2
Du kan løse problemet på følgende måde:

$sum = mysql_result(mysql_query("SELECT SUM(votes) AS total FROM poll GROUP BY 'option'"),0);
$result = mysql_query("SELECT * FROM poll");

$row['votes'] / $sum * 100;
Avatar billede 7th Praktikant
15. juni 2004 - 17:23 #3
terry > så kan jeg jo ikke samtidig udtrække andre felter fra databasen i samme sætning.

jakobclausen > tak for dit eksempel. Jeg vil nødig lyde utaknemmelig, men sådan ved jeg godt man kan gøre :) Mit spørgsmål går på, om det kan gøres i en sætning, og så fremt i fald, hvordan.
Avatar billede terry Ekspert
15. juni 2004 - 17:29 #4
De felter du skal have med skal også i GROUP BY
Avatar billede terry Ekspert
15. juni 2004 - 17:29 #5
eller SUM (for eks.)
Avatar billede 7th Praktikant
15. juni 2004 - 17:30 #6
OK tak, det vil jeg prøve.

P.S. kan først svare tilbage imorgen.
Avatar billede arne_v Ekspert
15. juni 2004 - 19:44 #7
Jeg kan ikke helt se hvad du vil.

Tabellen ser ud som følger:

id  option  votes
1      A      100
2      B      150
3      C      200

Hvordan skal query output se ud ?

SELECT SUM(votes) AS total FROM poll;

giver:

total
450

hvilket du jo ikke vil bruge da det så kræver 2 queries.

SELECT option,SUM(votes) AS total FROM poll GROUP BY option;

giver:

option  votes
  A      100
  B      150
  C      200

hvilket jo ikke bidrager med noget nyt i forhold til tabellen.

Jeg gætter på at du vil have:

option  votes    total
  A      100      450
  B      150      450
  C      200      450

men det mener jeg ikke at man kan lave i MySQL (men vistnok godt i andre databaser).

Mit bedste bud er derfor:

(SELECT 'total',SUM(votes) FROM poll)
UNION
(SELECT option,votes FROM poll)

som bør give:

total    450
  A      100
  B      150
  C      200

så læser du første række, hapser total og læser resten af rækkerne i en løkke
hvor du bruger totalen.
Avatar billede 7th Praktikant
16. juni 2004 - 06:33 #8
arne_v > dit sidste gæt er rigtig. Jeg havde prøvet at lege med UNION, som du lærte mig sidste gang, men ikke som i dit eksempel :) Det virker forøvrigt fint. Eneste lille minus er omkring ordlængden, når man bruger UNION. 'total' angiver jo ordlængden for option, som indeholder et poll spørgsmål, hvorfor jeg jo kun får vist de første fem ord af spørgsmålet. Har du eventuelt også en løsning på det?

Husk lige et svar arne :)
Avatar billede arne_v Ekspert
16. juni 2004 - 07:20 #9
To forslag:

(SELECT 'superduperlangtnavnfortotal',SUM(votes) FROM poll)
UNION
(SELECT option,votes FROM poll)

fordi du jo ikke skal bruge det navn til noget som helst eller:

(SELECT CAST('total' AS VARCHAR(255)),SUM(votes) FROM poll)
UNION
(SELECT option,votes FROM poll)

som muligvis kan få den til at opføre sig ordentligt.
Avatar billede arne_v Ekspert
16. juni 2004 - 07:21 #10
Og det er en MySQL bøf:
  http://sql-info.de/mysql/gotchas.html#1_10
Avatar billede 7th Praktikant
16. juni 2004 - 07:53 #11
OK tak. Jeg tror jeg vil lege lidt med det selv, da CAST først er understøttet fra MySQL 4.0.2, hvilket jo kræver en absolut up-to-date version :)

Tak for din hjælp arne, og husk lige et svar :)
Avatar billede arne_v Ekspert
16. juni 2004 - 08:25 #12
svar
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