在类似博客的网站中,所有用户都可以为新闻“加注星标”(= 将其添加为书签,将其标记为“收藏夹”)。 我有一个用于统计的 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 条记录,并且每条记录都有 id
和 total_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 ))
关于Php/mysql 排名系统 - 在按列排序的结果集中放置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29718968/