SQL联表JOIN后按created_at优先级排序并按user_name分组查询实现
SQL修改方案
你的需求核心是排序逻辑调整:第一优先级为用户最新发帖时间倒序,保证有最新帖子的用户所有内容整体排在前面;第二优先级为同一用户下单条帖子的创建时间倒序。
支持窗口函数的数据库(MySQL 8.0+/PostgreSQL/SQL Server等)实现
SELECT users.name AS user_name, posts.* FROM posts JOIN users ON users.id = posts.user_id ORDER BY -- 按每个用户的最新发帖时间倒序,决定不同用户的整体排列顺序 MAX(posts.created_at) OVER (PARTITION BY users.id) DESC, -- 同一用户的帖子按创建时间倒序排列 posts.created_at DESC;
不支持窗口函数的低版本数据库(如MySQL 5.x)实现
SELECT u.name AS user_name, p.* FROM posts p JOIN users u ON u.id = p.user_id -- 关联获取每个用户的最新发帖时间 JOIN ( SELECT user_id, MAX(created_at) AS latest_post_time FROM posts GROUP BY user_id ) ulp ON ulp.user_id = p.user_id ORDER BY ulp.latest_post_time DESC, p.created_at DESC;
小提示:原SQL中
SELECT *会同时查询posts和users表的字段,若两表存在同名字段(如id)会引发冲突,建议根据实际需求明确指定需要查询的字段,避免生产环境报错。
内容的提问来源于stack exchange,提问作者przbadu
相关产品推荐
相关产品推荐

