因此,正如问题的标题所解释的,我想将表的时间戳列向上取整(例如123456789
变为12345000
),以便可以使用这些取整后的时间戳根据插入的日期(或至少接近一天)对表中的行进行排序。
因此,在基于时间戳的常规排序中,将根据插入的第二个时间戳对记录进行排序(因为时间戳是基于第二个时间戳的)。我想做的是,将这些常规的时间戳压缩成覆盖天而不是一秒的时间戳,这样就可以根据大于一秒的时间单位(我希望它接近一天)对我的记录进行排序。
下面是一个示例表:
---------POSTS---------
ID TITLE TIME LIKES
1 "hello wor" 12345 12
2 "abcdef" 13345 32
3 "yes no" 55531 99921
4 "hello wor" 23345 25
5 "fghijklm" 55532 65
现在,考虑按
TIME desc
对上表进行排序,首先是在55532
创建的帖子,然后是23345
,依此类推。。。但是,有一个问题,假设我想按TIME DESC, LIKES DESC
对表格进行排序,这样我就可以从那些相对较新且受社区欢迎的帖子中得到一个很好的排名,在55532
创建的只有65
喜欢的帖子会出现在55531
创建的有99921
喜欢的帖子之前,显然,这是不一致的,因为第二个是琐碎的,不重要。为了消除这种不一致性,我想找到一种方法,将TIME
列的值更改为覆盖更长时间段的值,而不仅仅是1秒,例如,如果我可以将它们转换为覆盖一天而不是一秒的单位,那么,当执行my55531
sort时,在55532
和TIME
处创建的帖子将被视为相等(因为它们现在具有相同的值,这将是它们创建的粗糙日期,而不是它们创建的第二天),然后排序到达likes,然后首先排序具有55531
likes的99921
,然后55532
,只有65
喜欢。创建一个包含文章创建日期的新列不是一个选项,我必须使用已有的时间戳列来创建。
到目前为止,我已经提出了两种可能的解决方案:
1-使用
ROUND(time, -5) as condensed_time
,然后使用condensed_time
对行进行排序。更丑的解决方案,而不是动态,
case when (UNIX_TIMESTAMP() - time) < 86400 then 0 when (UNIX_TIMESTAMP() - time) < 259200 then 1 when (UNIX_TIMESTAMP() - time) < 604800 then 2 when (UNIX_TIMESTAMP() - time) < 864000 then 3 when (UNIX_TIMESTAMP() - time) < 1728000 then 4 when (UNIX_TIMESTAMP() - time) < 2592000 then 5 else 6 end)
。下面是我的其余查询,以防您对全局感兴趣(我想用我所说的压缩时间按创建的日期(或20小时,或40小时,您可以得到这个想法)进行排序:
select *, (select count(id) from post_votes where post_votes.post_id = posts.id) as total_votes, (select count(id) from favorites where favorites.post_id = posts.id) as total_favorites, (select count(id) from notifications where type = 5 and notifications.extra = posts.id) as total_sends, ROUND(time, -5) as condensed_post_time from posts where (title like concat('%',:tag ,'%') or title like concat('%', :tag) or title like concat(:tag,'%')) and (posted_by not in (SELECT SUBSTRING_INDEX(user_ids, '-', -1) as blocked_user FROM blocked_users WHERE SUBSTRING_INDEX(user_ids, '-', 1) = :base_user_id) and posted_by not in (SELECT SUBSTRING_INDEX(user_ids, '-', 1) as blocker FROM blocked_users WHERE SUBSTRING_INDEX(user_ids, '-', -1) = :base_user_id) and posted_by not in (SELECT user_id from account_states)) order by condensed_post_time desc, total_votes desc, total_favorites desc limit 3
如果您有任何问题或希望我详细说明,请在评论中告知我,我将乐意回答,并感谢您抽出时间阅读我的问题:)
最佳答案
好吧,同时,有件事要考虑。。。
SELECT FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP()/86400)*86400) x;
+---------------------+
| x |
+---------------------+
| 2017-07-24 01:00:00 |
+---------------------+
关于mysql - 四舍五入时间戳列以使其覆盖更长的时间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45272866/