我想定期更新数据库中的行,但也希望更受欢迎的行(请求更多的行)更频繁地更新。我以为我可以基于两个参数:人气和自上次更新以来的时间。
id | title | popularity | last_updated
---+-------+------------+-------------
1 | A | 148 | 20190501
2 | B | 3874 | 20190201
3 | C | 29 | 20190104
4 | D | 242 | 20190314
5 | E | 398 | 20190325
6 | F | 3 | 20190128
last_updated
列的格式为YYYYMMDD
。
我首先以为我可以简单地使用ORDER BY
:
SELECT * FROM results ORDER BY last_updated, popularity;
但是,如果两行或更多行的last_updated
的值相同,则此查询仅关心popularity
列。
是否有可能将popularity
和last_updated
变成另一个可以用于这种排序的值?
答案 0 :(得分:0)
难点在于定义受欢迎程度和最新更新之间的重要性级别。
如何计算人气值?它会减少吗?大多数主题在一段时间(流行)中很受欢迎,并很快成为老新闻。为了知道当前的记录流行度,我建议保留额外的一栏popularityOnUpdate,该列保留上次更新时的流行度值。当受欢迎程度降低时,受欢迎程度值的增量将消失,因此PopularOnUpdate值和受欢迎程度值之间的差异。
查询可以变为:
order by POP_WEIGHT*(popularity - popularityOnUpdate)
+ UPD_WEIGHT*(current date - lastUpdate) DESCENDING
POP_WEIGHT和UPD_WEIGHT是必须定义的常数,它们表示2个条件(受欢迎程度和最新更新)的重要性。流行度降低后,最后一次更新的值将使该记录在排名中上升。
答案 1 :(得分:0)
当然,有很多方法可以选择公式,以将人气和last_update合并为一个值进行排序。因此,这更多是模板,而不是现成的答案
仅使用流行度,我们可以使用random()函数为流行度添加一个因素
SELECT *
FROM results
ORDER BY popularity * random() DESC
对于日期,从今天减去它,然后对该结果使用random()是有意义的,因此,如果我们将其相加
SELECT *
FROM results
ORDER BY popularity * random() - (current_date - last_updated) * random() DESC
正如评论中指出的那样,我可能误解了last_update的优先级,因此,如果较旧的更新更有可能被更新,则切换符号
SELECT *
FROM results
ORDER BY popularity * random() + (current_date - last_updated) * random()
所以现在我们从上次更新中减去天数,以便新更新的值更高,但是再次使用random(),以便不给出顺序。这可以作为一个开始,但是我不确定这两个部分之间的平衡是否良好,或者可能取决于流行度与last_updated对结果的影响程度,是否需要将其中之一乘以某个因素。
然后,还可以向SELECT添加一个LIMIT,甚至可以将该值乘以random()
答案 2 :(得分:-1)
您的查询为真
table.buttons().container().appendTo( '#dynamic_table_wrapper .col-md-6:eq(0)' );
它将按last_updated升序排序,如果您重复了last_updated列的值,则会按受欢迎程度排序
只要看到这个答案,您就会了解我 SQL multiple column ordering