【问题标题】:storing a rank in mysql database在mysql数据库中存储排名
【发布时间】:2014-11-17 12:24:51
【问题描述】:

我目前正在尝试将排名存储在数据库中。

我需要存储按他们喜欢的歌曲排名的位置。目前我可以这样存储它:

SET @r=0;
UPDATE song_board_t SET song_ranking= @r:= (@r+1) ORDER BY song_likes DESC; 

这将是我每天在一个临时表上运行的东西,然后复制到另一个表中。

我遇到的问题是,如果 song_likes 相等,我需要 song_ranking 相等,例如,如果两首歌曲各有 100 个喜欢,它们应该具有相同的排名。

目前它只计算行数,因此每个排名都比前一个多一个。

如果其中一些可能需要在 PHP 而不是 sql 中完成,我可以。

任何帮助将不胜感激。

提前致谢

ZH

【问题讨论】:

  • 在oracle中这将是分析函数dense_rank()的工作,但我不知道mysql是否有分析函数。另外,我建议不要使排名保持不变。应该没有更新,只是选择。
  • 因为有大量的行,我想时不时地执行这个任务。然后需要遍历所有内容的选择将非常繁重。如果用户正在查看一首歌曲并想要查看排名,我还需要持久值。我不想为了显示一个结果而选择所有行。除非我想错了?
  • 您实际上是在为排名创建缓存。这是否支付取决于歌曲的数量。只要少于 10.000,我就完全不用担心使用分析函数(从 oracle 的角度来看)。持久排名的一个坏处是您不能轻易更改为每个用户的排名、去年的排名等。所有这些简单的选择都需要使用缓存机制。

标签: php mysql sql database mariadb


【解决方案1】:

你可以用这个查询来做到这一点:

UPDATE song_board_t s
INNER JOIN (
    SELECT
    song, /*or whatever the primary key is*/
    @r := IF(@prev = song_likes, @r, @r + 1) as ranking,
    @prev := song_likes
    FROM
    song_board_t
    , (SELECT @r := 0, @prev := null) var_init_subquery
    ORDER BY song_likes DESC
) sq ON s.song = sq.song
SET s.song_ranking = sq.ranking;

【讨论】:

  • 完美,正是我想要的。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
  • 2021-03-16
相关资源
最近更新 更多