select count(*) + 1 as place
from
(select song_id
from votes
group by song_id
having avg(strength) >
(select avg(strength)
from votes
where song_id = 1)) dt
Tack, det fungerade jättebra förutom vid ett villkor, om en låt inte har några röster (dvs. 0 i betyg). Alla som har 0 i betyg nu (inga röster) får place 1. Dem borde istället få en position efter alla som har röster.
select count(*) + 1 as place
from
(select song_id
from votes
group by song_id
having avg(strength) >
coalesce((select avg(strength)
from votes
where song_id = 1),0) dt
Nu inser jag dock att det är ganska många med samma betyg och får därför samma place, och därefter får även dom som ligger efter konstig place te.x:
1. låt1 <- betyg 5.0
1. låt2 <- betyg 5.0
1. låt3 <- betyg 5.0
4. låt4 <- betyg 2.0 <- den borde ju få rank 2 eller att det blir 1, 2, 3, 4 istället för 1, 1, 1, 4
Problemet uppstår av någon anledning när jag vill hämta röster från ett specifikt land från artist. Se nedan hur jag gjort nu:
SELECT COUNT(*) + 1 AS rank
FROM (SELECT v.song_id
FROM votes v
INNER JOIN songs s
ON v.song_id = s.id
INNER JOIN artists a
ON s.artist_id = a.id
WHERE a.country = "se"
GROUP BY v.song_id
HAVING AVG(strength) > (SELECT AVG(strength) FROM votes WHERE song_id = 1)) dt
Det blir inga fel men jag får såhär:
1. låt1 -> betyg 5.0
2. låt2 -> betyg 4.0
4. låt3 -> betyg 3.5 <- här borde det väl vara 3.
4. låt3 -> betyg 3.5 <- här borde det väl vara 3.
6. låt4 -> betyg 3.0 <- och här borde det vara 4
SELECT COUNT(*) + 1 AS rank
FROM (SELECT v.song_id
FROM ' . TABLE_VOTES . ' v
GROUP BY v.song_id
HAVING AVG(strength) > (SELECT AVG(v.strength) FROM ' . TABLE_VOTES . ' v INNER JOIN ' . TABLE_SONGS . ' s ON v.song_id = s.id INNER JOIN ' . TABLE_ARTISTS . ' a ON s.artist_id = a.id WHERE v.song_id = ' . $song['id'] . ' AND a.country = "se")) dt
När jag gjorde så blev det:
1. låt1 -> betyg 5.0
5. låt2 -> betyg 4.0
12. låt3 -> betyg 3.5
12. låt3 -> betyg 3.5
15. låt4 -> betyg 3.0
Det hjälpte heller inte om jag behöll a.country = "se" innan subselected också :/