webForumDet fria alternativet
Logga in / Bli medlem

Left join och average (MySql)

Databaser & SQL

2 svar · 250 visningar · startad av Ankman

Medlem sedan juni 2002116 inlägg
Trådstart#1

Jag vill med denna SQL-sats ha fram alla rader i songs som stämmer med villkoret record_id, de rader i song_grades som har ett betyg av den inloggade användaren (sg.user_id = $this->logged_in_user_id) samt medelbetyg på varje låt.
Som den ser ut nu så tar den bara med de låtar som har ett betyg satt, jag vill alltså ha alla. Om jag tar bort den delen med average (joinen med sg2) så funkar det som det skall. Någon?

SELECT
       s.*, sg.grade, AVG(sg2.grade) AS average
 FROM
 	songs s
 LEFT JOIN
 	song_grades sg
 ON
 	s.id = sg.song_id
 AND
 	sg.user_id = $this->logged_in_user_id
 LEFT JOIN
 	song_grades sg2 
 ON
 	s.id = sg2.song_id
 WHERE
 	s.record_id = $record_id
 GROUP BY
 	sg2.song_id
 ORDER BY
	 s.order_num
Medlem sedan dec. 20003 887 inlägg
#2

Du gör en väldigt skum GROUP BY. Din SELECT innehåller inte ens den kolumnen, så den bör inte ens fungera, men det är väl MySQLs fula sätt att hantera GROUP BY.

Man ska egentligen ange alla kolumner i GROUP BY som man väljer ut i SELECT som inte är aggregatfunktioner.

SELECT s.id, s.name, s.blablabla, sg.grade, AVG(sg2.grade) AS average
.
.
.
GROUP BY s.id, s.name, s.blablabla, sg.grade
Medlem sedan juni 2002116 inlägg
#3

Jag hade inte riktigt förstått vad group by hade för funktion, lade till den när MySql talade om att jag måste ha den när jag lade till AVG(). Måste nog läsa på lite om SQL.

367 ms totalt · 4 externa anrop · v20260731065814-full.51f67c91
121 ms — deklarationer (db)
120 ms — hämta statistik (db)
122 ms — hämta tråd, inlägg och bilagor (db)
118 ms — ändringar (db)