帖子数据库有字段:
create_time 创建时间
last_reply_time 最后回复时间
现在我想以回复时间进行排序(回复就顶上来),用sqlalchemy或者原生sql语句如何实现,因为 last_reply_time 没有回复的话是空的,所以我自己的写排序不能确定。
topic.query.order_by(topic.last_reply_time.desc()).all()
帖子数据库有字段:
create_time 创建时间
last_reply_time 最后回复时间
现在我想以回复时间进行排序(回复就顶上来),用sqlalchemy或者原生sql语句如何实现,因为 last_reply_time 没有回复的话是空的,所以我自己的写排序不能确定。
topic.query.order_by(topic.last_reply_time.desc()).all()
您可以使用 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
进行排序,使得回复时间不为空的帖子排在前面,回复时间为空的帖子排在后面。
2 回答4.9k 阅读✓ 已解决
2 回答1k 阅读✓ 已解决
4 回答837 阅读✓ 已解决
3 回答1k 阅读✓ 已解决
3 回答1.1k 阅读✓ 已解决
1 回答1.6k 阅读✓ 已解决
1 回答1.1k 阅读✓ 已解决
建议最后回复时间在插入的时候与create_time相同,不要留空。