2016-07-06 2 views
0

Я пытаюсь соединить две таблицы:SQL JOIN двух таблиц с AVG

songs 
id | song | artist 
---|------|------- 
1 | foo | bar 
2 | fuu | bor 
3 | fyy | bir 

score 
id | score 
---|------ 
1 | 2 
2 | 4 
3 | 8 
2 | 6 
3 | 2 

с помощью этой команды SQL:

SELECT songs.id, songs.song, songs.artist, score.score FROM songs LEFT JOIN score ON score.id=songs.id ORDER BY songs.id, score DESC 

Что я вернусь является дубликатами одной и той же песни с несколькими оценки, Я бы хотел, чтобы оценка была усреднена.

result 
id | song | artist | score 
---|------|--------|------- 
1 | foo | bar | 2 
2 | fuu | bor | 4 
2 | fuu | bor | 6 
3 | fyy | bir | 8 
3 | fyy | bir | 2 

Я попробовал, что с помощью:

SELECT songs.id, songs.song, songs.artist, ROUND(AVG(score.score),1) AS 'score' FROM songs INNER JOIN score ON score.id=songs.id ORDER BY score DESC 

Но что усредняет все баллы, а не только оценка каждой отдельной песни

result 
id | song | artist | score 
---|------|--------|------- 
1 | foo | bar | 4.4 
+1

Добавить 'Группа By' .. –

+0

результаты не имеет первичного ключа, который может оказаться проблематичным. – Strawberry

ответ

3

Вы должны GROUP BY всех полей, которые вы хотите сохранить:

SELECT songs.id, songs.song, songs.artist, 
    AVG(score.score * 1.0) AS AvgScore 
FROM songs 
    LEFT JOIN score 
     ON score.id=songs.id 
GROUP BY songs.id, songs.song, songs.artist 
ORDER BY songs.id, score DESC 

В качестве альтернативы, вы можете просто сделать это:

SELECT songs.id, songs.song, songs.artist, 
    (SELECT AVG(Score) FROM score WHERE score.id = songs.id) AS AvgScore) 
FROM songs 
0

использование "группа по" songs.id

SELECT songs.id, songs.song, songs.artist, 
    ROUND(AVG(score.score),1) AS 'score' FROM songs 
    INNER JOIN score ON score.id=songs.id 
group by songs.id ORDER BY score DESC 
+0

Не нужно говорить об этом в каждом ответе. ОП задал вопрос, чтобы получить ответы, поэтому он обязательно попытается. Нет суровых чувств;) –

+0

@Prdp: я удалил его. но в большинстве случаев мы не получили никакого ответа, по крайней мере, это работает или нет :( –

0

Используйте эту Выберите A.id, a.song, .artist, ср (b.score), как оценка от песен внутреннего соединение оценки б на a.id = b.id группы по a.id, a.artist, a.song

0

Вы должны GROUP BY и присоединиться данные влево (JOIN LEFT)

попробовать это:

SELECT 
    songs.id, 
    songs.song, 
    songs.artist, 
    ROUND(AVG(score.score), 1) AS 'score' 
FROM songs 
LEFT JOIN score ON score.id = songs.id 
GROUP BY songs.id 
ORDER BY score DESC 
Смежные вопросы