Php/mysql 排名系统 - 在按列排序的结果集中放置

标签 php mysql

在类似博客的网站中,所有用户都可以为新闻“加注星标”(= 将其添加为书签,将其标记为“收藏夹”)。 我有一个用于统计的 mysql 表。

table_news_stats

id_news
total_stars (int) //Total number of users who starred this news
placement (int)

placement 字段很直观:如果您按 total_stars 字段对所有新闻进行排序,您将获得每个新闻 placement。因此,星数最多的新闻将是 1,依此类推。

所以,假设我的 table_news_stats 中有 700 条记录,并且每条记录都有 idtotal_stars 计数,如何我为每条记录自动更新 placement 字段?哪个查询更快/更好?

table_news_stats 内容示例:

First record (A):
1-3654-?

Second record (B):
2-2456-?

Third record (C):
3-8654-?

如果您按星数排序记录: 记录的顺序是C - A - B

所以...结果将是:

First record (A):
1-3654-2

Second record (B):
2-2456-3

Third record (C):
3-8654-1

澄清:
为什么我需要 placement 字段?
这很简单……放置字段将在每个月的第一天由一个 cronjob 填充。基本上,它将提供每个新闻在受欢迎程度方面的排名的“快照”(就像当月月初一样)。因此,由于放置字段,我将获得以下信息:

"The 1st day of this month the 'top starred' news list was like this:  
1- News C  
2- NewsA  
3- News B "    

然后,通过查询“SELECT * FROM table_news_stats ORDER BY total_stars DESC”,我可以获得新的排名(实时)。

因此,我将获得以下信息:

"At the time the page is loaded, the 'top starred' news list is like this:  
1- News A  
2- News C  
3- News B "  

最后通过对比两个排名,得到最后一条信息:

"News A has gained a position" +1
"News C has lost a position" -1
"News B has no change in position" +0

如果有更好的方法,请告诉我。

最佳答案

我猜你不需要更新表只是:

SELECT *
FROM table_news_stats
ORDER BY total_stars DESC

但是如果你想知道每个人的位置,你可以:

SELECT *, IF(@idx IS NULL,@idx:= 1,@idx:= @idx+1) 
FROM table_news_stats
ORDER BY total_stars DESC

如果您仍然需要更新,例如:

UPDATE table_news_stats 
SET placement = FIND_IN_SET(id_news,(SELECT GROUP_CONCAT(t.id_news) FROM (SELECT id_news
    FROM table_news_stats 
    ORDER BY total_stars DESC) t ))

SQLFiddle

关于Php/mysql 排名系统 - 在按列排序的结果集中放置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29718968/

相关文章:

php - 尝试将 ajax post 请求发送到 php 到 db 但出现错误

php - 在 Wordpress 中更改动态页面的标题

mysql - 根据 MySQL SUM 结果选择最高行,有关系

mysql - 大量自定义分类 WordPress 卡住数据库和整个网站

php - 当我选择多个复选框进行删除时...只删除了最后一个复选框!意味着它可以从数据库中删除 1 个数据

javascript - 消除换行符 - javascript

php - 如何使用 php 在选择框中组织多个结果?

php如何遍历3维数组?

mysql - 如何平均最近 5 笔交易的最后金额

mysql - MySQL JSON 字符串的大小写和重音不敏感排序