请教sqlserver问题

表News,主要字段有id,fid,sid,del,time.等等
这是一个网站内信的表,老式的表都是一条一条的,想改成类似微信聊天这种,有聊天就合并为一个聊天,但是懒得做会话表,就这样进行去重查询
收件:根据sid去重,保留最新一条where n.Sid = 2
发件:根据fid去重,保留最新一条where n.Fid = 2
尝试了很多次,根据AI的解答得出以下方案,有没有懂的大佬看看有问题吗,或者可以优化一下

SELECT *,(select nickname from user as C where n.Sid = C.Id) as nick
from
( SELECT *, ROW_NUMBER() OVER (PARTITION BY Sid, Fid ORDER BY Time desc) AS RowNum FROM News where del=0) AS n
where
n.Sid = 2 AND n.RowNum = 1 and  n.del=0
回复列表(5|隐藏机器人聊天)
  • @Ta / 2023-11-25 / /

    @echo醉老仙,意思是《如何从 News 表中,找出 fid=x, sid=y, del=0, time 最大 的一条数据》吗?

    若是,这样好像简单些?(需要 sid、fid、del、time 索引)

    SELECT id
    FROM News
    WHERE fid=x, sid=y, del=0
    ORDER BY time DESC
    LIMIT 1
    
  • @Ta / 2023-11-25 / /

    @无名啊,以往的论坛聊天消息,每条消息都单独显示,打开消息,一个人发10条消息给我,就显示了十条,我现在需要合并,类似微信聊天
    因此目标是,对于收件箱,查询所有的sid,排除重复,返回数据

  • @Ta / 2023-11-25 / /

    @echo醉老仙,是说,根据聊天对象分组,并显示最后消息时间?

    打开与某人的聊天界面时,则按时间显示所有历史记录?

  • @Ta / 2023-11-26 / /

    @无名啊,谢谢,不过并非如此,我的意思是合并消息
    即使是现在的林子依然沿用了旧版wap的内信模式,不是吗

    • 另外我的是sqlserver,不是mysql
    • 以下图片仅供参考
      screenshot20231126.png(118.48 KB)
  • @Ta / 2023-11-27 / /

    @echo醉老仙,那就是,按照发件人分组,取最后发消息时间、消息总数?

    SELECT MAX(time) AS 最新一条消息时间, COUNT(*) AS 该发件人历史消息数
    FROM News
    WHERE 收件人ID = 自己 AND del = 0
    GROUP BY 发件人ID
    
添加新回复
回复需要登录