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

如何从数据表获取私信列表?用SQL查询用户ID1与他人的最新消息

嘿,我来帮你搞定这两个私信相关的SQL问题!下面分情况给你详细说明:

1. 如何从数据表中获取私信列表?

首先得先明确你的私信数据表结构,通常这类表会包含这些核心字段:message_id(消息ID,主键)、sender_id(发送者用户ID)、receiver_id(接收者用户ID)、content(消息内容)、created_at(消息发送时间)。

如果要获取某个特定用户(比如用户ID=1)的所有私信(不管是自己发的还是收到的),可以用这条SQL:

SELECT 
    message_id,
    sender_id,
    receiver_id,
    content,
    created_at,
    -- 方便区分消息是发送还是接收的
    CASE 
        WHEN sender_id = 1 THEN '发送'
        ELSE '接收'
    END AS message_type
FROM 
    private_messages
WHERE 
    sender_id = 1 OR receiver_id = 1
ORDER BY 
    created_at DESC;

这条语句会把用户1参与的所有消息按时间倒序排列,最新的消息排在最前面。

如果只是想获取系统中所有私信的完整列表,直接查询并按时间排序即可:

SELECT * 
FROM private_messages
ORDER BY created_at DESC;
2. 获取用户ID为1的用户与其他用户之间的最新消息

这个需求的核心是:找出用户1和每个对话对象之间的最后一条消息(不管是对方发的还是用户1发的)。这里有两种常用的实现方式,你可以根据自己的数据库版本和表结构选择:

方法一:使用窗口函数(推荐,语法清晰且高效)

利用ROW_NUMBER()窗口函数,把用户1和每个对话对象的所有消息分组,然后按时间倒序排序,取每组的第一条就是最新消息:

WITH ranked_messages AS (
    SELECT 
        message_id,
        sender_id,
        receiver_id,
        content,
        created_at,
        -- 生成唯一的对话标识:把两个用户ID按大小顺序拼接,确保A和B的对话不管谁发消息都算同一组
        CONCAT(LEAST(sender_id, receiver_id), '-', GREATEST(sender_id, receiver_id)) AS conversation_id,
        ROW_NUMBER() OVER (
            PARTITION BY conversation_id
            ORDER BY created_at DESC
        ) AS rn
    FROM 
        private_messages
    WHERE 
        sender_id = 1 OR receiver_id = 1
)
SELECT 
    message_id,
    sender_id,
    receiver_id,
    content,
    created_at
FROM 
    ranked_messages
WHERE 
    rn = 1
ORDER BY 
    created_at DESC;

方法二:使用MAX()聚合关联

先找到每个对话的最新发送时间,再关联原表获取对应的消息内容:

SELECT 
    pm.*
FROM 
    private_messages pm
JOIN (
    SELECT 
        CONCAT(LEAST(sender_id, receiver_id), '-', GREATEST(sender_id, receiver_id)) AS conversation_id,
        MAX(created_at) AS latest_time
    FROM 
        private_messages
    WHERE 
        sender_id = 1 OR receiver_id = 1
    GROUP BY 
        conversation_id
) latest ON 
    CONCAT(LEAST(pm.sender_id, pm.receiver_id), '-', GREATEST(pm.sender_id, pm.receiver_id)) = latest.conversation_id
    AND pm.created_at = latest.latest_time
WHERE 
    pm.sender_id = 1 OR pm.receiver_id = 1
ORDER BY 
    pm.created_at DESC;

小提示:

如果你的私信表已经设计了专门的conversation_id字段(很多成熟的私信系统会单独存这个字段,用来标识同一对话),那可以直接用conversation_id分组,不用拼接用户ID,这样查询效率会更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:38:05