You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对MessageTable短信表按联系人分组后按日期时间交叉排序

问题描述

我现有一张名为MessageTable的短信表,存储了用户Ali的手机短信收发记录,包含Ali接收他人短信和向他人发送的回复短信,表结构和数据如下:

idsendDatesendTimesenderreceiver
11397/01/0210:02KarimAli
21398/05/0905:30HamedAli
31398/06/0705:10MajidAli
41398/08/0906:12AliKarim
51399/02/0107:15AliSaeed
61399/07/0208:51ParsaAli
71399/08/0612:20AliKarim
81399/09/0420:01AliHamed
91399/12/0822:05AsgarAli
101400/01/0123:11MajidAli
111400/02/1314:10KarimAli
121400/04/0516:25AliHamed
121400/06/1222:25AliMajid
121400/07/2408:25SaeedAli

需要对该表进行排序,满足以下要求:首先将Ali与每位联系人的所有往来短信单独归为一组排列,其次每组内的短信按发送日期和时间升序排列,预期排序效果如下:

idsendDatesendTimesenderreceiver
11397/01/0210:02KarimAli
41398/08/0906:12AliKarim
71399/08/0612:20AliKarim
111400/02/1314:10KarimAli
21398/05/0905:30HamedAli
81399/09/0420:01AliHamed
121400/04/0516:25AliHamed
31398/06/0705:10MajidAli
101400/01/0123:11MajidAli
121400/06/1222:25AliMajid
51399/02/0107:15AliSaeed
121400/07/2408:25SaeedAli
61399/07/0208:51ParsaAli
91399/12/0822:05AsgarAli

请问如何编写对应的SQL代码实现上述排序需求?


解决方案

核心思路是先提取每条短信对应的联系人(即sender和receiver中不是Ali的那一方),先按联系人排序实现同组聚集,再按发送日期和时间升序排列组内内容,对应SQL代码如下:

SELECT *
FROM MessageTable
ORDER BY
  -- 提取往来联系人,按联系人分组排序
  CASE WHEN sender = 'Ali' THEN receiver ELSE sender END,
  -- 组内按发送时间升序排列
  sendDate ASC,
  sendTime ASC;

说明

  1. CASE判断逻辑会自动识别每条记录对应的联系人:如果Ali是发送方,取接收方为联系人;如果Ali是接收方,取发送方为联系人,保证同一位联系人的所有往来短信会被归为同一组
  2. 如果你的数据库中sendDate为字符串类型无法直接按日期逻辑排序,可以先通过日期转换函数处理,例如MySQL可以用STR_TO_DATE(sendDate, '%Y/%m/%d')替换排序条件中的sendDate,避免字符串排序出错。

内容的提问来源于stack exchange,提问作者honey bee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 15:18:05