找出行在具有不同值的行列表中的排名

时间:2014-09-19 14:28:02

标签: php mysql

我正在尝试为音乐家创建一个排名系统,在我的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类型中的排名?

我希望这个解释是可以理解的。

2 个答案:

答案 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';

DEMO

<强>更新

你实际上可以从内表中删除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'