我正在尝试为音乐家创建一个排名系统,在我的mysql表中我将它们列出如下:
id genre artist rating votes
1 rock pink floyd 138 25
2 rock black sabbath 149 28
3 pop katy perry 98 12
4 rock the who 72 14
用户可以按照1-10的等级对艺术家进行评分,在投票时我只是将数字(1-10)作为评级增加到表格并将投票增加1,因此要确定等级我将划分通过投票评分,这将是排名。
我理解如何创建一个概览,显示所有具有等级的艺术家,但我试图找到一种有效的方法来确定特定艺术家的排名。
长话短说:如果我要进入黑色安息日子页面,我将如何确定其在rock
类型中的排名?
我希望这个解释是可以理解的。
答案 0 :(得分:0)
SELECT COUNT(mi.genre) + 1 rank
FROM musician m
LEFT JOIN (
SELECT genre, ROUND(COALESCE(rating/votes,0),10) rating_per_vote
FROM musician
) mi
ON mi.genre = m.genre
AND mi.rating_per_vote > ROUND(COALESCE(m.rating/m.votes,0),10)
WHERE m.artist = 'black sabbath';
<强>更新强>
你实际上可以从内表中删除id,我做了一些游戏。
但是,您确实需要ROUND()
来确保比较正确。
答案 1 :(得分:0)
另一种解决方案,子查询较少:
SELECT
m.artist,
r.rank,
r.average
FROM
musician m
JOIN
(
SELECT
id,
@rank := @rank + 1 rank,
IF(votes = 0, 0, ROUND(rating/votes, 10)) average
FROM
musician, (SELECT @rank := 0) uv
WHERE genre = 'rock'
ORDER BY average DESC
) r
ON
r.id = m.id
WHERE m.artist = 'black sabbath'