IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> mybatis+mysql分组排序,每组取前N条数据 -> 正文阅读

[大数据]mybatis+mysql分组排序,每组取前N条数据

1. MySql实现分组排序

1.1表说明

小说章节表

CREATE TABLE fiction_chapter (
id int(11) NOT NULL,
chapter_id varchar(32) NOT NULL COMMENT ‘章节id’,
fiction_id varchar(32) NOT NULL COMMENT ‘小说id’,
chapter_sub_sort int(11) DEFAULT NULL COMMENT ‘卷序号’,
chapter_sub_name varchar(255) DEFAULT NULL COMMENT ‘卷’,
chapter_sort int(12) DEFAULT NULL COMMENT ‘章节号’,
chapter_name varchar(255) DEFAULT NULL COMMENT ‘章节名称’,
create_time datetime NOT NULL COMMENT ‘创建时间’,
update_time datetime NOT NULL COMMENT ‘更新时间’,
PRIMARY KEY (chapter_id),
KEY fiction_id (fiction_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

1.2 数据样例

在这里插入图片描述

1.3 需求与实现

需要查询出每本小说的最新章节
sql:

SELECT t.* FROM
(
SELECT * ,
IF(@bak=fiction_id,@rank:=@rank+1,@rank:=1) rank ,
@bak:=fiction_id bak
FROM fiction_chapter
ORDER BY fiction_id,chapter_sub_sort DESC ,chapter_sort DESC
) t
WHERE t.rank < 2
limit 1,1000

@bak:=fiction_id 记录上一个的fiction_id 小说uuid ;

IF(@bak=fiction_id,@rank:=@rank+1,@rank:=1)
如果上一个的小说uuid和这个相等,rank=rank+1,否则rank重置为1

limit 1,1000 是因为数据量太大,先取1000条

sql逻辑:
因为是取最新章节,先在子查询中给每本小说的所有章节按照 卷倒叙,章节倒叙 排序,并且生成倒叙的序号。此时章节越大,编号越小
然后外部再查询一次,筛选rank<2的行,如果需要取其他条数,改值就行

2.在mybatis中查询

2.1 问题 mybatis里执行rank都为1

注意: sql语句不能直接放进 mybatis xml里用。需要改造一下
直接在mybatis中执行会出现 rank 值都是1的问题。
请添加图片描述

2.2修改

修改分2步:
1. 在jdbc连接中添加 允许同时执行多条语句:&allowMultiQueries=true

spring.datasource.url=jdbc:mysql://localhost:3306/mydata?serverTimezone=UTC&characterEncoding=utf-8&allowMultiQueries=true

2.在xml 里 sql之前设置用到的变量初始化
添加 : set @rank:=0,@bak:=’’;

<select id="selectLastChapter" resultType="fictionChapter">
        set @rank:=0,@bak:='';
        SELECT t.* FROM(
            SELECT *
            ,IF(@bak=fiction_id,@rank:=@rank+1,@rank:=1) rank
            ,@bak:=fiction_id AS bak
            FROM fiction_chapter
            ORDER BY fiction_id,chapter_sub_sort DESC ,chapter_sort DESC
        ) t
       <where>
           t.rank <![CDATA[ < ]]> 2
       </where>
        limit 1,1000
    </select>

结语:
1. 上面的解决办法是在dyc_dyc大佬帖子里找到解决办法的,感谢大佬
链接: https://ask.csdn.net/questions/4644962
2. 还有个办法是子查询count(*)比较的 但是我的数据量才23W就卡死了,
没有解决成功,就改成rank了

SELECT a.* FROM fiction_chapter a WHERE 1>
	(SELECT COUNT(*) FROM fiction_chapter 
	 WHERE fiction_id=a.fiction_id 
	 	   AND chapter_sort>a.chapter_sort )
ORDER BY a.fiction_id,a.chapter_sort

3.优化
fiction_id和chapter_id虽然设置了索引,但是我那个sql查看执行计划却没有走索引,我只能limit限制下条数,23W条执行时间在3秒左右。这个sql办法还是有待优化,之后数据量还会加大会更卡。
水平不足,目前没解决,如果后续解决了再更新。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-02-05 21:48:17  更:2022-02-05 21:50:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 13:59:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码