论坛帖子排序语句

帖子数据库有字段:
create_time 创建时间
last_reply_time 最后回复时间
现在我想以回复时间进行排序(回复就顶上来),用sqlalchemy或者原生sql语句如何实现,因为 last_reply_time 没有回复的话是空的,所以我自己的写排序不能确定。
topic.query.order_by(topic.last_reply_time.desc()).all()

阅读 3.7k
4 个回答

建议最后回复时间在插入的时候与create_time相同,不要留空。

你将last_reply_time字段设置为timestamp或datetime数据类型,然后就可以使用时间降序进行排序,你最后的写法是可以的。

last_reply_time如果是时间戳的话建议默认设置为0
写查询语句 last_reply_time>0 order by last_reply_time desc 就好了

您可以使用 case 函数来在排序时处理 last_reply_time 为空的情况。例如,您可以将空值视为最小值,并将其放在排序顺序的末尾。以下是一个示例 SQLAlchemy 查询:

from sqlalchemy import case

topics = Topic.query.order_by(
    case([(Topic.last_reply_time.is_(None), 1)], else_=0),
    Topic.last_reply_time.desc()
).all()

这个查询首先使用 case 函数将空值视为 1,并将非空值视为 0。然后,它按照这个计算结果以及 last_reply_time 进行排序,使得回复时间不为空的帖子排在前面,回复时间为空的帖子排在后面。

如果您想使用原生 SQL,可以使用类似下面的查询:

SELECT *
FROM topic
ORDER BY 
    CASE WHEN last_reply_time IS NULL THEN 1 ELSE 0 END,
    last_reply_time DESC;

这个查询与上面的 SQLAlchemy 查询类似,使用 CASE 函数来处理空值,将空值视为 1 并将非空值视为 0。然后,按照这个计算结果以及 last_reply_time 进行排序,使得回复时间不为空的帖子排在前面,回复时间为空的帖子排在后面。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题