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.
Databaser & SQLur Databashanterare & SQL
16 svar · 532 visningar · startad av k0ffe
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
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.
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
Som LarsG skrev, alla kolumner i SELECT-listan måste vara i GROUP BY, förutom de som är aggregatfunktioner (ex. COUNT(), SUM(), AVG()).
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... ?
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.
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...
LarsG?
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
Tack för all hjälp!
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?
Jo, det beror på versionen av MYSQL. Då får du använda varianten med group by.
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"