背景:

如果对一些评论、点赞、收藏等互动数据,使用了按照 type 分类存储,num 也是对应的。

这样如果创建一个帖子,那么就会出现 3 行数据(type 不同,num 不同,对应评论点赞和收藏),那如果我返回给前端,只想返回一行。
即 3 行数据转化为 3 列属性(评论、点赞、收藏)。

本文就是一个项目中的一个举例,不再单独举例子。

这里只关注了 sql编写,到 mapper 中怎么写,关于中间接口的定义,就不再赘述。

前端需要的字段都在,AlbumListVo中,不代表所有的都在一个数据表中,所以需要联查才可以。

@Data
@Schema(description = "专辑信息")
public class AlbumInfoVo {@NotEmpty(message = "专辑标题不能为空")@Length(min = 2, message = "专辑标题的长度必须大于2")@Schema(description = "标题", required=true)private String albumTitle;@Positive(message = "三级分类不能为空")@Schema(description = "三级分类id", required=true)private Long category3Id;@NotEmpty(message = "专辑简介不能为空")@Schema(description = "专辑简介", required=true)private String albumIntro;@NotEmpty(message = "专辑封面不能为空")@Schema(description = "专辑封面图", required=true)private String coverUrl;@Schema(description = "预计更新多少集")private Integer estimatedTrackCount;@Schema(description = "专辑简介,富文本")private String albumRichIntro;@NotEmpty(message = "付费类型不能为空")@Schema(description = "付费类型: 0101-免费、0102-vip免费、0103-付费", required=true)private String payType;@Schema(description = "价格类型: 0201-单集 0202-整专辑")private String priceType;@Schema(description = "原价")@JsonSerialize(using = Decimal2Serializer.class)private BigDecimal price;@Schema(description = "0.1-9.9  不打折 -1")@JsonSerialize(using = Decimal2Serializer.class)private BigDecimal discount = new BigDecimal(-1);@Schema(description = "0.1-9.9 不打折 -1")@JsonSerialize(using = Decimal2Serializer.class)private BigDecimal vipDiscount = new BigDecimal(-1);@Schema(description = "免费试听集数")private Integer tracksForFree;@Schema(description = "每集免费试听秒数")private Integer secondsForFree;@Schema(description = "购买须知,富文本")private String buyNotes;@Schema(description = "专辑卖点,富文本")private String sellingPoint;@Schema(description = "是否公开:0-否 1-是")private String isOpen;//递归校验//@Valid//@NotEmpty(message = "属性值集合不能为空")@Schema(description = "属性值集合")private List<AlbumAttributeValueVo> albumAttributeValueVoList;@NotEmptyPaid(message = "价格类型不能为空")public String getPayTypeAndPriceType() {return this.getPayType() + "_" + this.getPriceType();}@NotEmptyPaid(message = "价格不能为空")public String getPayTypeAndPrice() {return this.getPayType() + "_" + this.getPrice();}
}

在 sql 里面查关联表。

不同维度,你是4 行,但是我想要 1593 的4列属性,最后封装在一个Vo实体类中

selectalbum_info.id as albumId,album_info.album_title,album_info.cover_url,album_info.include_track_count,album_info.is_finished,album_info.status,album_stat.stat_num,album_stat.stat_typefrom album_infoinner join album_stat
on album_stat.album_id=album_info.id
where album_info.user_id = 19;

对于同一个albumId应该所有的属性在一行中,所以我们对他们进行分组一下

但是分组是有要求的:

分组划分的这一列必须是表的主键,不是就爆炸

这里首先以单个表来演示:

selectalbum_info.id as albumId,album_info.album_titlefrom album_info
where album_info.user_id = 19
group by album_info.id;

如果不是主键列进行分组

selectalbum_info.id as albumId,album_info.album_titlefrom album_info
where album_info.user_id = 19
group by album_info.user_id;

按照分组的列查询,但是如果有的了后面任意

selectalbum_info.user_id
这加其他列也一样报错from album_info
where album_info.user_id = 19
group by album_info.user_id;

分组的规则:

mysql5.7 后有一种模式,sql规范的模式:sql_mode,其中涉及到分组

单表

        分组是主键,select 后面可以跟这个表中的任意列

        不是主键 select 只能跟上分组的列,以及其他列的聚合函数处理后的结果

多表

        即使是主键分组,依然需要聚合函数处理

        这个跟了主键,但是加了聚合函数是成功了

selectalbum_info.user_id,count(album_info.id)
from album_info
where album_info.user_id = 19
group by album_info.user_id;

那如果是多表呢?做聚合函数

这里是个多表,哪怕是主键,后面有其他表,依然得用聚合函数!

那怎么去映射呢 4 行变 4列

我们这里用到了一个 if 函数,最后还是套聚合函数!

selectalbum_info.id as albumId,album_info.album_title,album_info.cover_url,album_info.include_track_count,album_info.is_finished,album_info.status,count(if(album_stat.stat_type='0401', album_stat.stat_num, 0)) as playStatNumfrom album_infoinner join album_stat
on album_stat.album_id=album_info.id
where album_info.user_id = 19
group by album_info.id;

这里只是显现了一行,但是如果 4 行转化也是同样的

因为要做一个分页,我们再进行一个排序。

order by album_info.update_time desc

编码实现

转到 mapper.xml 中写 sql,对写的sql 进行一个简单的更改

这里没去校验 userId 是因为这个前面使用了 TingshuLogin,不登录肯定不行

AlbumInfoMapper

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.anran.tingshu.album.mapper.AlbumInfoMapper"><select id="findUserAlbumPage" resultType="com.anran.tingshu.vo.album.AlbumInfoVo">selectalbum_info.id as albumId,album_info.album_title,album_info.cover_url,album_info.include_track_count,album_info.is_finished,album_info.status,max(if(album_stat.stat_type='0401', album_stat.stat_num, 0)) as playStatNum,max(if(album_stat.stat_type='0402', album_stat.stat_num, 0)) as subscribeStatNum,max(if(album_stat.stat_type='0403', album_stat.stat_num, 0)) as buyStatNum,max(if(album_stat.stat_type='0404', album_stat.stat_num, 0)) as commentsStatNumfrom album_infoinner join album_staton album_stat.album_id=album_info.id<where><if test="vo.albumTitle != null and vo.albumTitle != ''">and album_info.album_title=#{vo.albumTitle}</if><if test="vo.status != null and vo.status != ''">and album_info.status=#{vo.status}</if>and album_info.user_id=#{vo.userId} and album_info.is_deleted=0</where>group by album_info.idorder by album_info.update_time desc</select>
</mapper>
  • 因为不需要自定义数据,在 sql 方面完成了封装,所以不需要 mybatis 封装 ,所以直接返回值就是resultType而不是resultMap

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/96395.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/96395.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/96395.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

langchain4j笔记篇(阳哥)

一 概述1.1 概述langchain4j&#xff1a;langchain for java1.2 作用langchain4j的目标是简化将LLM集成到java应用程序中的过程。二 案例简单helloworld2.1 大模型调用三件套1.阿里百炼平台的通义模型&#xff1a; https://bailian.console.aliyun.com/2获取api-key&#x…

有鹿机器人的365天奇幻日记:我在景区当扫地僧

第一章 古建守护者&#xff1a;2cm的极致艺术琉璃瓦下的秘密记得那是个晨雾缭绕的清晨&#xff0c;我接到首个重要任务&#xff1a;清扫明代琉璃碑亭。这里的每块地砖都是文物&#xff0c;传统清洁工具根本不敢靠近。每天以2cm的精准贴边沿碑座作业&#xff0c;如今我每周都要为…

Objective-C方法参数标签怎么设置

在Objective-C中&#xff0c;方法名称可以通过几个标签名称组成&#xff0c;这是跟C/C中完全不一样的地方。每个标签都是字段冒号的写法&#xff0c;冒号后面是方法的参数&#xff0c;参数包括参数类型和参数变量&#xff0c;其中参数类型要用括号括起。方法参数的标签是通过在…

20250910_《SQL Server 数据库事务日志定期清理方案(精简优化版)》以10.1.1.31服务器的gtp-default数据库为例

《SQL Server 数据库事务日志定期清理方案(精简优化版)》 一、前提条件 数据库 gtp-default 已设置为完整恢复模式 (FULL)。 每天凌晨02:00执行完整备份,保证日志备份可用。 SQL Server Agent 已启用。 作业所有者为 sa,具有 sysadmin 权限。 Agent 服务账号 NT Service\S…

实习项目包装--HTTP 协议和 Web API

好的&#xff0c;完全没问题&#xff01;你问到了一个非常核心且基础的知识领域&#xff0c;这是现代Web开发和几乎所有网络应用的基石。我们暂别嵌入式系统&#xff0c;专门来上一堂关于 HTTP 协议和 Web API 的详细课程。 我会从最根本的概念讲起&#xff0c;逐步深入到你所…

ICCV-2025 | 中科院自动化所世界模型助力具身导航!NavMorph:连续环境中的视觉语言导航自演化世界模型

作者&#xff1a;Xuan Yao1,2^{1,2}1,2, Junyu Gao1,2^{1,2}1,2, Changsheng Xu1,2,3^{1,2,3}1,2,3单位&#xff1a;1^{1}1中科院自动化所多模态人工智能系统国家重点实验室&#xff0c;2^{2}2中国科学院大学人工智能学院&#xff0c;3^{3}3鹏城实验室论文标题&#xff1a;NavM…

【ARDUINO】ESP8266的AT指令返回内容集合

一、基础测试指令(确认模块通信) 1. AT(测试模块是否响应) 功能:检测ESP8266与控制器(如Arduino)的串口通信是否正常。 返回内容: 成功:OK(无额外数据,仅确认通信正常) 失败:无返回(可能是波特率不匹配、接线错误) 示例:发送:AT 返回: OK二、Wi-Fi模式配置指…

Mockoon:开源免费的本地Mock服务工具,提升前后端联调效率

你有没有过这种经历&#xff1f;做前端开发时&#xff0c;后端同事的接口还没写完&#xff0c;你这边要调页面数据&#xff0c;只能对着空控制台发呆&#xff1f;要么手动写个 JSON 文件当假数据&#xff0c;改一次数据就得重新保存文件、刷新页面&#xff1b;要么用在线 Mock …

【Mysql|第一篇】Mysql的安装与卸载、Navicat工具的使用

一、Mysql的安装与卸载&#xff1a; 1、查看是否安装过mysql&#xff1a; &#xff08;1&#xff09;cmd中输入mysql看是否有显式提醒 &#xff08;2&#xff09;右击此电脑&#xff0c;选择管理&#xff0c;在左侧栏中找到服务&#xff0c;查看是否有与mysql相关的 2、卸载的…

贪心算法应用:流行病干预策略问题详解

Java中的贪心算法应用&#xff1a;流行病干预策略问题详解 贪心算法是一种在每一步选择中都采取当前状态下最优的选择&#xff0c;从而希望导致全局最优解的算法策略。在流行病干预策略问题中&#xff0c;贪心算法可以有效地帮助我们做出资源分配决策&#xff0c;以达到最优的防…

git删除最近一次提交包括历史记录。

方法一&#xff1a;删除最近的一次提交&#xff08;最常见&#xff09; 如果你只是想撤销最后一次提交&#xff0c;这是最简单的方法。在本地删除提交 使用 git reset --hard 命令&#xff0c;将你的本地分支回退到上一次提交。Bashgit reset --hard HEAD^HEAD^ 指的是 HEAD 的…

前端拖拽功能实现全攻略

前端拖拽功能实现指南 设计一个拖拽组件确实需要考虑不少细节。下面我为你梳理了从核心思路、关键实现到注意事项的完整方案&#xff0c;并用表格对比了 Vue 和 React 的实现差异&#xff0c;希望能帮你全面掌握。 &#x1f9e0; 一、核心设计思路 一个拖拽组件的核心在于感…

ASP.NET MVC 连接 MySQL 数据库查询示例

为您创建一个完整的 ASP.NET MVC 应用程序&#xff0c;演示如何通过点击按钮连接 MySQL 数据库并查询数据表。 完整实现步骤 1. 首先安装必要的 NuGet 包 在项目中安装以下 NuGet 包&#xff1a; MySql.Data Dapper&#xff08;可选&#xff0c;用于简化数据访问&#xff0…

合理安排时间节点,避免影响正常生产——制造企业软件系统上线的关键考量

在制造企业的发展中&#xff0c;引入新的软件系统是提升管理效率、优化业务流程的重要举措。然而&#xff0c;软件系统的上线过程如果安排不当&#xff0c;很可能会对企业的正常生产造成负面影响。作为一名制造企业的行政经理&#xff0c;在软件选型和推进使用的过程中&#xf…

【一包通刷】晶晨S905L(B)/S905L2(B)/S905L3(B)-原机安卓4升级安卓7/安卓9-通刷包

【一包通刷】晶晨S905L(B)&#xff0f;S905L2(B)&#xff0f;S905L3(B)-原机安卓4升级安卓7&#xff0f;安卓9-通刷固件包线刷方法&#xff1a;1、准备好一根双公头USB线刷刷机线&#xff0c;长度30-50CM长度最佳&#xff0c;同时准备一台电脑&#xff1b;2、电脑上安装好刷机工…

Vite开发:从入门到精通

序章&#xff1a;构建之道现代前端的破局者前端发展简史&#xff1a;从 Grunt、Gulp、Webpack 到 Vite构建工具的本质与未来为什么是 Vite&#xff1f;——新时代的构建哲学本书阅读导览与学习路径第一篇 入门启蒙识得 Vite 真面目第1章 Vite 初识什么是 Vite&#xff1f;设计理…

Spring事件监听机制(二)

接着之前的事件监听机制实现&#xff0c;我们可以进一步优化。从以下两个方面&#xff1a;1.使用EventListener注解Configuration public class TestListener2 {public static void main(String[] args) {AnnotationConfigApplicationContext context new AnnotationConfigApp…

STM32物联网项目---ESP8266微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制---代码篇(四)

一、简介该篇代码实现了ESP8266上传数据到云平台的功能&#xff08;可以更改命令和温度的数据&#xff09;&#xff0c;我只测试了上传数据&#xff0c;是没有问题的&#xff0c;如果自己由别的需求可以自行在云平台创建设备和更改代码&#xff1a;二、工程源码这个代码是进行验…

城际班车驾驶员安全学习课程

背景 正在做一个班车预约小程序&#xff0c;里面需要增加一个功能&#xff1a;驾驶员在线学习打卡功能&#xff1a; 图文学习内容&#xff0c;学习完之后&#xff0c;一键打卡&#xff1a;学习完毕&#xff1b;视频学习内容&#xff0c;看完后&#xff0c;一键打卡&#xff1…

Cy5-Tyramide, Cyanine 5 Tyramide;1431148-26-3

一、基本内容&#xff1a; Cyanine 5 Tyramide (Tyramide-Cy5) 是一种红色荧光染料&#xff0c;被用作辣根过氧化物酶 HRP 催化沉积的报告荧光底物&#xff0c;是一种免疫测定和核酸原位杂交中的信号放大技术。 英文名称&#xff1a;Cy5-Tyramide, Cyanine 5 Tyramide中文名称…