在一次工作中需要用到查出每个群聊的最新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 应该很容易看得懂,重要是思路。