一句mysql复杂查询搞崩一个壮汉

我说的这个壮汉就是我自己啦,哈哈哈哈哈😊

之前的复杂查询基本是用gorm自带的关联查询preload()方法,把数据模型关联关系绑定清楚,傻瓜式的preload就搞定,复杂点的数据就硬写,大力出奇迹

像这种经典的多对多关联查询,一句话也就搞定了,db.model(&User).preload("Roles.Permissions"),返回的数据直接丢给前端,让前端自己提取数据,去重,重组成权限数组,毕竟前段写着方便。(前端也是我,我对前端更熟),就这样rbac模块功能也出来了。前端动态路由也实现了,看上去还让我给纸糊出一个系统的基础。

但是,自己知道,内功不深厚,早晚都得补,所以恶补mysql和gorm,过程很痛苦,但终究是弄出来了,

记录一下爬坡过程

1,查用户列表时候,把用户的角色信息查出来,放在一个数组里,并且去重,没有角色返回\[\]
csharp 复制代码
type UserListVO struct {
    ID       uint                     `json:"id"`
    Username string                   `json:"username"`
    Phone    string                   `json:"phone"`
    Email    string                   `json:"email"`
    Roles    []map[string]interface{} `json:"roles" gorm:"serializer:json"`
}
var list []UserListVO
database.DB.Raw(`
    select u.id,u.username,
       if(
         count(r.id) =0,'[]',json_arrayagg(json_object('id',r.id,'name',r.name))
       ) as roles
    from users u
    left join user_roles ur on ur.user_id=u.id
    left join roles r on r.id=ur.role_id
    group by u.id
`).Scan(&list)
response.Success(c, list)
2,查角色数据时,把他绑定的权限查出来,放在一个数组里,并且去重,没有数据返回\[\]
csharp 复制代码
type RoleListVO struct {
    ID          uint                     `json:"id"`
    Name        string                   `json:"name"`
    Code        string                   `json:"code"`
    Permissions []map[string]interface{} `json:"permissions" gorm:"serializer:json"`
}
var list []RoleListVO
database.DB.Raw(`
    select r.*,
        if(
        count(p.id)=0,'[]',json_arrayagg(json_object('id',p.id,'name',p.name))
        ) as permissions
    from roles r
    left join role_permissions rp on rp.role_id=r.id
    left join permissions p on p.id=rp.permission_id
    group by r.id
`).Scan(&list)
response.Success(c, list)
3,查用户时候把用户的权限查出来,放一个数组里,并且去重,没有数据返回\[\]
csharp 复制代码
type UserListVO struct {
    ID          uint                     `json:"id"`
    Username    string                   `json:"username"`
    Phone       string                   `json:"phone"`
    Email       string                   `json:"email"`
    Permissions []map[string]interface{} `json:"permissionsArr" gorm:"serializer:json"`
}
var list []UserListVO
database.DB.Raw(`
    select u.*,
        if(
        count(p.id) = 0,'[]',json_arrayagg(json_object('id',p.id,'name',p.name))
        ) as permissions
    from users u
    left join (
        select distinct ur.user_id,rp.permission_id
        from user_roles as ur
        left join role_permissions as rp on ur.role_id=rp.role_id
    ) as up on up.user_id=u.id
    left join permissions as p on p.id=up.permission_id
    group by u.id
`).Scan(&list)
response.Success(c, list)

费了我不少脑细胞,我看到了那扇门透出的光,就是那扇全栈架构师的大门

相关推荐
Rain的Java大神之路22 分钟前
JavaWeb开发如何解决跨域问题
java·前端·后端·nginx·web安全·面试·运维开发
IT_陈寒2 小时前
Python的多线程居然是个假把式?搞清GIL让我少熬三天夜
前端·人工智能·后端
明月_清风2 小时前
位图与布隆过滤器:海量数据下的"存在性判断"艺术
前端·后端·算法
明月_清风3 小时前
Hash 表从入门到精通:Go 实战与工程细节
前端·后端·算法
ly76893 小时前
MySQL 自增主键耗尽:从原理到应急恢复
数据库·mysql·innodb·故障恢复·自增主键·主键设计
考虑考虑3 小时前
ElasticSearch索引命令
运维·后端·elasticsearch
文人sec3 小时前
MySQL主库出问题了,从库怎么办?备库为什么会延迟好几个小时?
android·数据库·mysql
Java小白笔记4 小时前
MySQL 8.0 常用内置函数用例
数据库·mysql·mybatis
玉宇夕落4 小时前
背单词项目一:融会贯通:从零构建"单词大师"后台——Next.js + Supabase + Drizzle 全栈开发实战
后端
ZGG0034 小时前
MySQL 索引详解:B+ 树、聚簇索引与最左前缀
java·数据库·mysql