首页 > 数据库 >SQL:查询每个类别最新的5条记录

SQL:查询每个类别最新的5条记录

时间:2024-09-16 09:01:43浏览次数:9  
标签:comment uuid text 查询 select SQL 类别 where append

场景

根据 主表的ID列表,查询 各个ID 的 text_comment 中 最新的5条记录。

table: text_comment

field: text_uuid

ben发布于博客园

v1:使用 union

select * from
(select * from text_comment
where text_uuid = 'cf6fd43a5f0527840fcdbbad55ce44c5'
order by create_time desc
limit 5) a
union
select * from
(select * from text_comment
where text_uuid = '75e84ef20ff5988617834f9fd7183d78'
order by create_time desc
) a
union
select * from
(select * from text_comment
where text_uuid = 'e7bbbcaa6525254e2737336a858502a2'
order by create_time desc
) a

 

v2:窗口函数 row_number() over(...)

MySQL 8 + 才可以 使用 窗口函数,之前的不支持。

select * from
(
select *, row_number() over (
partition by text_uuid
order by create_time desc) as row_num 
from text_comment
where text_uuid in ('cf6fd43a5f0527840fcdbbad55ce44c5',
'75e84ef20ff5988617834f9fd7183d78', 
'e7bbbcaa6525254e2737336a858502a2', 'dads')) as x
where row_num <=5
;

上面,最外层的 select 是必须的。是否可以改进,需要再探索 TODO。ben发布于博客园

 

mybatis 中 实现

在 Mapper 中 使用 org.apache.ibatis.annotations.SelectProvider 注解 定义一个 查询函数。ben发布于博客园

public interface TextCommentMapper extends BaseMapper<TextComment> {

    @SelectProvider(type = DynamicSql1.class, method = "func1")
    List<TextComment> getLastestRecordsByWindowFunc(@Param("uuids") List<String> uuids,
                                                    @Param("maxNum") int maxNum);

    class DynamicSql1 {

        public String func1(@Param("uuids") List<String> uuids, @Param("maxNum") int maxNum) {
            if (CollectionUtils.isEmpty(uuids)) {
                return "selec * from text_comment where 1=0";
            }

            StringBuilder sql = new StringBuilder();
            sql.append("select * from (select *, row_number() over ( partition by text_uuid")
                    .append(" order by create_time desc) as row_num from text_comment")
                    .append(" where text_uuid IN (");
            for (int i = 0; i < uuids.size(); i++) {
                if (i > 0) {
                    sql.append(", ");
                }
                sql.append("#{uuids[").append(i).append("]}");
            }
            sql.append(")) AS tab")
                    .append(" where row_num <= ")
                    .append(maxNum);

            return sql.toString();
        }
    }
}

 

END

 

ben发布于博客园

ben发布于博客园

 

标签:comment,uuid,text,查询,select,SQL,类别,where,append
From: https://www.cnblogs.com/luo630/p/18413575

相关文章

  • MYSQL面试系列-04
    MYSQL面试系列-0417.关于redolog和binlog的刷盘机制、redolog、undolog作用、GTID是做什么的?innodb_flush_log_at_trx_commit及sync_binlog参数意义双117.1innodb_flush_log_at_trx_commit该变量定义了InnoDB在每次事务提交时,如何处理未刷入(flush)的重做日志信息......
  • MySQL锁机制揭秘:从行锁到表锁,共享锁到排他锁,悲观锁到乐观锁的全面解读
    MySQL有哪些锁1、按照锁的粒度划分行锁是最低粒度的的锁,锁住指定行的数据,加锁的开销较大,加锁较慢,可能会出现死锁的情况,锁的竞争度会较低,并发度相对较高。但是如果where条件里的字段没有加索引,则加的行锁会自动升级为表锁,因为行锁是基于索引去进行操作的,所以想要加行锁,就......
  • 一文看完MySQL 9.0新特性!
    本文总结自MySQL8.4以来,在MySQL9.0中新增、废弃、更改和删除的内容。MySQL9.0中新增或更改的功能。1MySQL9.0新特性1VECTOR类型支持MySQL9.0支持VECTOR列类型。向量是一个数据结构,它由条目列表(4字节浮点值)组成,可以表示为二进制字符串值或列表格式字符串。VECT......
  • mysql学习教程,从入门到精通,TOP 和MySQL LIMIT 子句(15)
    1、TOP和MySQLLIMIT子句内容在SQL中,不同的数据库系统对于限制查询结果的数量有不同的实现方式。TOP关键字主要用于SQLServer和Access数据库中,而LIMIT子句则主要用于MySQL、PostgreSQL(通过LIMIT/OFFSET语法)、SQLite等数据库中。下面将分别详细介绍这两个功能......
  • MySQL间隙锁,next-key锁
    间隙锁间隙锁是对索引记录之间的间隙的锁,或者是对第一个索引记录之前或最后一个索引记录之后的间隙的锁。例如,SELECTc1FROMtWHEREc1BETWEEN10and20FORUPDATE;阻止其他事务将的值插入15到列中t.c1,无论列中是否已经存在任何此类值,因为该范围内所有现有值之间的......
  • MySQL练手题--体育馆的人流量(困难)
    一、准备工作CreatetableIfNotExistsStadium(idint,visit_dateDATENULL,peopleint);TruncatetableStadium;insertintoStadium(id,visit_date,people)values('1','2017-01-01','10');insertintoStadium(id,visit_date,......
  • mysql事务
    MySQL事务是数据库管理系统(DBMS)中的一项关键功能,确保一系列数据库操作作为一个整体被执行,且具有原子性、一致性、隔离性和持久性(ACID)的特性。事务处理机制可以帮助开发者确保数据的完整性和一致性,特别是在出现错误或并发操作时。1.事务的四大特性(ACID)原子性......
  • 分布式 SQL 数据库之TiDB
    TiDB是一个开源的分布式SQL数据库,具备高可扩展性和强一致性。它支持在线扩展、水平伸缩,提供与MySQL兼容的SQL接口,同时支持事务处理和复杂查询。TiDB是为大规模在线事务处理(OLTP)和在线分析处理(OLAP)设计的统一数据库,能够处理海量数据,并确保数据强一致性。概述1.TiDB......
  • mySql 添加新用户
    运行以下SQL语句来创建新用户并设置密码:INSERTINTOmysql.user(User,Host,Password)VALUES('用户名','主机名',PASSWORD('密码'));其中,'用户名'为新用户的名称,     '主机名'为允许该用户连接的主机,可以使用通配符'%'表示允许从任何主机连接,    ......
  • 【MySQL】MySQL索引与事务的透析——(超详解)
    前言......