webForumDet fria alternativet

Räknar fel!

16 svar · 532 visningar · startad av k0ffe

k0ffeMedlem sedan maj 2003352 inlägg
#1

Halloj, jag har en SQL-fråga som jag tycks behöva lite hjälp med.
Det är ett forum, där alla poster visas samt hur många svar respektive har. Men om en post inte har något svar, så skriver den ut posten med en "1" som antal svar ändå?

SELECT forum.*, anvandare.bild, count(*) as antalsvar FROM forum LEFT JOIN forum_svar ON forum.FID=forum_svar.SID INNER JOIN anvandare ON forum.anvID=anvandare.ID GROUP BY forum.FID ORDER BY forum.senasteSvar desc

Hade tidigare INNER JOIN istället för LEFT, men då visades ingen post alls som inte hade något svar...

SELECT forum.*, anvandare.bild, count(*) as antalsvar FROM forum INNER JOIN forum_svar ON forum.FID=forum_svar.SID INNER JOIN anvandare ON forum.anvID=anvandare.ID GROUP BY forum.FID ORDER BY forum.senasteSvar desc
LarsGMedlem sedan dec. 200012 464 inlägg
#2
count(anvandare.id)

Så där kan du inte använda group by. Alla kolumner i select-listan som inte ingår i en aggregatfunktion måste vara med i group by.

k0ffeMedlem sedan maj 2003352 inlägg
#3

Tack!

Hur menar du med group by?

k0ffeMedlem sedan maj 2003352 inlägg
#4

Det fungerar inte ändå :(

SELECT forum.*, anvandare.bild, count(anvandare.id) as antalsvar FROM forum LEFT JOIN forum_svar ON forum.FID=forum_svar.SID INNER JOIN anvandare ON forum.anvID=anvandare.ID GROUP BY forum.FID ORDER BY forum.senasteSvar desc

EDIT: count(forum_svar.ID) skulle det vara.

Utveckla gärna det med group by LarsG

@ndersMedlem sedan juni 200032 969 inlägg
#5

Som LarsG skrev, alla kolumner i SELECT-listan måste vara i GROUP BY, förutom de som är aggregatfunktioner (ex. COUNT(), SUM(), AVG()).

k0ffeMedlem sedan maj 2003352 inlägg
#6

Ok, men varför måste dom det?
Nu har jag ju alla kolumner (*) med i SELECT, måste jag då skriva ut alla i GROUP BY, t.ex forum.rubrik, forum.inlagg, forum.datum osv... ?

LarsGMedlem sedan dec. 200012 464 inlägg
#7

C1 C2
-------
1   2
1   3

select c1,c2 from t group by c1

vilket värde från kolumn c2 vill du ha?

k0ffeMedlem sedan maj 2003352 inlägg
#8

:) vad menar du?

Jag ville bara ha en förklaring till vad GROUP BY faktiskt gör...

LarsGMedlem sedan dec. 200012 464 inlägg
#9

Group by innebär att om det finns flera värden som är lika i en kolumn så kombineras dessa till en rad. Med hjälp av aggregatfunktioner (sum etc) kan man utföra beräkningar inom varje grupp. I ovanstående exempel så borde en post returneras, då det finns en grupp av värden i c1 men hur skall då databashanteraren veta vilket av de värden som finns i kolumnen c2 som skall returneras? Därför säger alla DBMS (utom mysql som returnerar ett godtyckligt värde) att en sådan fråga inte är förutsägbar.

Om du gör group by på alla kolumner i select-listan och inte har någon aggregatfunktion så fungerar group by på samma sätt som distinct, dvs den tar bort duplikat från resultatet.

k0ffeMedlem sedan maj 2003352 inlägg
#10

Ok, tack. Men hur blir det då i mitt fall?
Den kolumn som kan innehålla identisk data är ju forum_svar.SID, som håller reda på vilket forum det tillhör...

k0ffeMedlem sedan maj 2003352 inlägg
#11

LarsG?

LarsGMedlem sedan dec. 200012 464 inlägg
#12
SELECT forum.*, 
anvandare.bild, 
(select count(*) 
  from forum_svar
where sid = FID) as antalsvar
from forum 
INNER JOIN anvandare ON forum.anvID=anvandare.ID ORDER BY forum.senasteSvar desc
k0ffeMedlem sedan maj 2003352 inlägg
#13

Tack för all hjälp!

@ndersMedlem sedan juni 200032 969 inlägg
k0ffeMedlem sedan maj 2003352 inlägg
#15

LarsG, den fungerar inte! Men kan det ha med mySQL-versionen att göra? Läste en annan tråd som fick samma fel, nämlingen:

ERROR [42000] [MySQL][ODBC 3.51 Driver][mysqld-4.0.16-log]You have an error in your SQL syntax. 
Check the manual that corresponds to your MySQL server version for the right syntax to use 
near 'select count(*) from forum_svar where SID = forum.FID) as antal

Hela frågan ser ut såhär:

"SELECT forum.*, anvandare.bild, (select count(*) from forum_svar where SID = forum.FID) as antalsvar from forum INNER JOIN anvandare ON forum.anvID=anvandare.ID ORDER BY forum.senasteSvar desc"

Eftersom jag har Loopia som webbhotell, kan jag ju inte påverka versionen av mySQL, om det nu är det som är felet vill säga?

LarsGMedlem sedan dec. 200012 464 inlägg
#16

Jo, det beror på versionen av MYSQL. Då får du använda varianten med group by.

k0ffeMedlem sedan maj 2003352 inlägg
#17

Alltså denna?

"SELECT forum.*, anvandare.bild, count(forum_svar.id) as antalsvar FROM forum LEFT JOIN forum_svar ON forum.FID=forum_svar.SID INNER JOIN anvandare ON forum.anvID=anvandare.ID GROUP BY forum.FID ORDER BY forum.senasteSvar desc"
137 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)