含UNION的SQL查询如何实现按chat_message_id降序排序?
调整UNION结构SQL实现按chat_message_id降序排序的方案
原语句存在的核心问题
- 两个UNION查询分支均未选取
chat_message_id字段,直接在外层书写ORDER BY chat_message_id DESC会触发“字段不存在”的执行报错 - 两个分支的返回列别名不统一,前者将返回值命名为
sender_id,后者命名为receiver_id,UNION操作会以第一个分支的列名作为合并结果集的列标识,会导致后续排序的字段映射逻辑混乱 - 即便勉强识别字段,原排序语句因为没有和返回列做绑定,也无法真正作用于合并后的全量结果集
具体调整逻辑
- 统一两个UNION分支的返回列别名,保证列结构对齐
- 每个分支都将
chat_message_id纳入返回列,作为排序的依据字段 - 嵌套一层子查询承载UNION合并的结果,在外层执行排序逻辑,最终只返回业务需要的用户ID列,避免冗余字段输出
- 可根据业务需求将默认带去重逻辑的
UNION替换为UNION ALL,减少不必要的去重计算开销,提升查询性能
调整后的可运行SQL
SELECT user_id FROM ( SELECT to_user_id AS user_id, chat_message_id FROM $chat_table_name WHERE ( (to_user_id = $current_user_id OR from_user_id = $current_user_id) AND post_id = $post_id ) UNION ALL SELECT from_user_id AS user_id, chat_message_id FROM $chat_table_name WHERE ( (from_user_id = $current_user_id OR to_user_id = $current_user_id) AND post_id = $post_id ) ) AS merged_chat_result ORDER BY chat_message_id DESC
注意事项:如果业务场景要求返回的用户ID不能重复,可以将上述代码中的
UNION ALL替换为原生的UNION,保留排序字段后排序逻辑依然可以正常生效,不会触发语法报错。
内容的提问来源于stack exchange,提问作者Rajneesh Tiwari
相关产品推荐
相关产品推荐

