MySQL:从分组结果中选择排名

时间:2017-07-26 16:57:24

标签: php mysql

我有一张表格,其中包含广播电台的数据以及播放的歌曲。播放的所有歌曲都存储在名为' radio_data'的表格中。此表如下所示:

-----------------------------------------------
| id | artist_id | song_id | play_date        |
| 1    230         420       2017-5-12 12:00  |
| 2    212         971       2017-5-12 12:01  |
| 3    230         420       2017-5-12 13:00  |
| 4    230         420       2017-5-12 15:00  |
| 5    212         971       2017-5-12 15:02  |
-----------------------------------------------

我有一个页面,其中显示了一首特定歌曲的某些统计信息。在这个页面上,我想根据它的播放次数显示歌曲的等级。

让我们说如果我是song_id 420的页面,它将在2首歌中排名第1。 我不知道从哪里开始。我有这个查询来分组歌曲:

SELECT COUNT(`id`) AS `playcount`, `artist_id`, `song_id` FROM `radio_data` GROUP BY `song_id` ORDER BY `playcount` DESC

这给了我以下结果:

-----------------------------------
| playcount | artist_id | song_id |
|  3           230         420    |
|  2           212         971    |
-----------------------------------

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您可以使用用户变量来显示排名:

set @rn := 0;

select @rn := @rn + 1 as rank,
    song_id,
    artist_id,
    count(*) as times_played
from your_table
group by song_id, artist_id
order by times_played desc;

如果你想获得最高分,比如说10首歌曲,你最后可以添加limit 10

答案 1 :(得分:0)

SELECT
    song_id, count(id) played_times, @rank := @rank +1 rank
FROM
    (
      songs_plays CROSS JOIN (SELECT @rank := 0)rank
    )

GROUP BY song_id
ORDER BY played_times DESC

结果是

+------------+--------------+--------+
| song_id    | played_times | rank   |
+------------+--------------+--------+
|   420      |       3      |   1    |
|   971      |       2      |   2    |
+------------+--------------+--------+

在SQL小提琴(http://sqlfiddle.com/#!9/1c48d8/5

上直播