MySQL对数据按照列分组并查出指定的条目数量,同时对每条数据排序。

本文介绍了一种使用SQL查询特定群聊的最新20条消息的方法。通过给每组数据进行分组并添加序号,确保了数据的正确性和效率。此方法适用于需要获取群聊历史记录的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在一次工作中需要用到查出每个群聊的最新20条数据。

下面直接进入正题

这段 sql 是通过给每组数据进行分组后给其添加了一列数据列。

参考了一篇别人的文章,原文是采用了 set 定义变量, 和case 因为set 所以会有个问题并行的问题,所以这里采用了

(SELECT @order_num := '') F1, (SELECT @TAG := '') F1 来分别保存字段和序号 以及 IF 显得更易懂。

t2是关联其他信息的表,这里可以不关联。 必须先按分组列排序,再按时间排序

SELECT
    t1.id,
    t1.creator AS creator,
    t1.correlation_id AS correlationId,
    t1.correlation_type AS correlationType,
    t2.real_name AS `realName`,
    t1.body AS body,
    t1.type,
    t2.photo AS photo,
    t1.create_time AS createTime
FROM
    (
        SELECT
            t.id
        FROM
            (
                SELECT
                    t.id,
                    t.correlation_id,

                IF (
                    @TAG = t.correlation_id,
                    @order_num := @order_num + 1,
                    @order_num := 1
                ) rownum,
                @TAG := t.correlation_id
            FROM
                t_chat_message t,
                (SELECT @TAG := '') F1,
                (SELECT @order_num := 0) F2
            WHERE
                t.correlation_id IN (
                    'fe4c6420dacd4ca6999ed43d00fc18ea',
                    '3d43a73e0fd244fda838790c1ddd876d',
                    'dbfe6f12b9b14af9ae64e03514de6055',
                    '615296ff455f45edb24cb44366d8982c'
                )
            ORDER BY
                t.correlation_id,
                t.create_time ASC
            ) t
        WHERE
            t.rownum <= 20
    ) t
LEFT JOIN t_chat_message t1 ON t.id = t1.id
LEFT JOIN t_user_info t2 ON t1.creator = t2.login_name;

上面 sql 应该很容易看得懂,重要是思路。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值