【发布时间】: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