SQL 層面行轉列

背景:

如果對一些評論、點贊、收藏等互動數據,使用了按照 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中文名稱…