webForumDet fria alternativet

Left join och average (MySql)

2 svar · 248 visningar · startad av Ankman

AnkmanMedlem sedan juni 2002115 inlägg
#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
Engine^Medlem sedan dec. 20002 861 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
AnkmanMedlem sedan juni 2002115 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.

Genererad på 377 ms · cache AV · v20260730165559-full.f96bc7eb