在Mybatis中使用连表查询的一次实际应用
以前在工作中很少使用多表关联查询,对连表查询的具体作用和使用场景也没有很直观的认识,通过这次在项目中的实际应用,对此有了一定的认识,特记录如下。
关联表介绍:
分别是属性表attr_info、属性值表attr_val_info、商品sku信息表sku_info、商品sku所属的属性信息表sku_attr_info。
attr_info表:存储属性大类信息,如颜色、配置、网络
attr_val_info表:存储属性的具体值,如颜色-黄色、配置-128G、网络-移动、联通
sku_info表:存储sku的基础信息
sku_attr_info:存储sku对应的属性及属性值信息

业务场景一:
查询出每个sku所对应的属性名称及属性值名称
SELECT DISTINCT
sai.product_id AS product_id,
sai.attr_id AS attr_id,
ai. attr_name,
sai.attr_val_id AS attr_val_id,
sai.attr_val_name AS attr_val_name
FROM
attr_info ai
JOIN attr_val_info avi ON ai.attr_id = avi.attr_id
JOIN sku_attr_info sai ON (
sai.product_id = avi.product_id
AND sai.attr_val_id = avi.attr_val_id
)
将这三张表中的记录在业务代码中全部查询出来,然后在代码中编写拆装拼接逻辑到一个model中,这样费时费力不好把握各个表之间的关联关系而且逻辑不清晰,很容易出错。
连表查询就相当于将表记录之间的关联逻辑由代码层面,迁移至数据库层面,在数据库中通过关联查询语句查找到满足关联条件的数据集合,在业务代码中只需要对此查询集合进行where条件查询即可。
业务场景二:
在原有的sku_attr_info表中,一个sku的属性信息对应一行记录,每个sku包含多个属性,即多行记录,现在想查询出sku所对应的颜色id和配置id以及其他的sku的属性,用一行显示。
SELECT
si.product_id,
si.sku_id,
si.sku_url,
sai.color_id,
sai.spec_id
FROM
sku_info si
JOIN (
SELECT
sku_id,
MAX(
CASE attr_id
WHEN 1 THEN
attr_val_id
ELSE
0
END
) color_id,
MAX(
CASE attr_id
WHEN 2 THEN
attr_val_id
ELSE
0
END
) spec_id
FROM
sku_attr_info
GROUP BY
sku_id
) sai ON (
si.sku_id = sai.sku_id
);
在Mybatis中使用连表查询的一次实际应用的更多相关文章
- MyBatis中实现多表查询
如果查询的数据量大,推荐使用N+1次查询.数据量少使用联合查询... 一. 1.Mybatis是实现多表查询方式 1.1 业务装配:对两个表编写单表查询语句,在业务(Service)把查询的两表结果 ...
- Mybatis中的多表查询 多对多
示例:用户和角色 一个用户可以有多个角色 一个角色可以赋予多个用户 步骤: 1.建立两张表:用户表,角色表 让用户表和角色表具有多对多的关系. 需要使用中间表,中间表中包含各自的主键,在中间表中是外键 ...
- Mybatis中的多表查询 多对一,一对多
示例:用户和账户 一个用户可以有多个账户 一个账户只能属于一个用户(多个账户也可以属于同一个用户) 步骤: 1.建立两张表:用户表,账户表 让用户表和账户表之间具备一对多的关系:需要使用外键在账户表中 ...
- Hibernate中的多表查询及抓取策略
1.Hibernate中的多表查询 1.1SQL中的多表查询 [交叉连接] select * from A,B; [内连接] 显示内连接:inner join(inner 可以省略) Select * ...
- mysql中的回表查询与索引覆盖
了解一下MySQL中的回表查询与索引覆盖. 回表查询 要说回表查询,先要从InnoDB的索引实现说起.InnoDB有两大类索引,一类是聚集索引(Clustered Index),一类是普通索引(Sec ...
- Mybatis学习——一对一关联表查询
1.SQL语句建表 CREATE TABLE teacher( t_id ) ); CREATE TABLE class( c_id ), teacher_id INT ); ALTER TABLE ...
- MyBatis总结-实现关联表查询
一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...
- MyBatis学习之多表查询
一对多需求:即一张表class中又含有多张表(teacher,student)内容.现根据class_id 来获取对应的班级信息(包括学生和老师信息) 方式一:嵌套结果 使用嵌套结果映射来处理重复的联 ...
- Oracle中的多表查询
多表查询 l 笛卡尔积: N*M l 使用关联字段消除笛卡尔积的多余数据: SELECT EMP.*,DEPT.DNAME,DEPT.LOC FROM EMP, DEPT WHERE EMP.DEPT ...
随机推荐
- linux 统计命令执行后的行数或者统计目录下文件数目
ls |wc 是统计你这个目录下的文件数目.ls |wc -l是输出第一个结果即31即文件的数目.
- Zookeeper(三)-- JAVA原生API
一.前提 jar包:zookeeper-3.4.9.jar,slf4j-api-1.6.1.jar,slf4j-log4j12-1.6.1.jar,log4j-1.2.15.jar 二.Demo pa ...
- /etc/hostname
我们可以使用 hostname 命令来修改主机名,但只是临时生效,如果想永久生效可以编辑 /etc/hostname 文件,注意不是每个 Linux 发行版都有该文件 root@Ubuntu_Lee: ...
- cocos2d-x游戏引擎核心之五——触摸事件和触摸分发器机制
一.触摸事件 为了处理屏幕触摸事件,Cocos2d-x 提供了非常方便.灵活的支持.在深入研究 Cocos2d-x 的触摸事件分发机制之前,我们利用 CCLayer 已经封装好的触摸接口来实现对简单的 ...
- iPhone较为基础的代码片段
Iphone代码片段导航 1.给UITableViewController添加ToolBar. self.navigationController.toolbarHidden = NO; //默认是隐 ...
- 使用类/结构体时关于ZeroMomery用法错误
今天同事在写了如下结构体: typedef struct _tagInfo { std::list<int> lst; std::vector<int> nVec; } INF ...
- js中replace()方法
str.replace(/Microsoft/g, "W3School");//全局替换 str.replace(/Microsoft/, "W3School" ...
- Python-Numpy的tile函数用法
1.函数的定义与说明 函数格式tile(A,reps) A和reps都是array_like A的类型众多,几乎所有类型都可以:array, list, tuple, dict, matrix以及基本 ...
- 【PHP】 判断是否微信内置浏览器
PHP 判断是手机端还是PC端 function isMobile() { // 如果有HTTP_X_WAP_PROFILE则一定是移动设备 if (isset($_SERVER['HTTP_X_WA ...
- Hibernate(1)——数据访问层的架构模式<转>
数据库的概念.逻辑.数据模型概念 应用程序的分层体系结构发展 MVC设计模式与四层结构的对应关系 持久层的设计目标 数据映射器架构模式 JDBC的缺点 Hibernate简介 迅速使用Hibernat ...