以前在工作中很少使用多表关联查询,对连表查询的具体作用和使用场景也没有很直观的认识,通过这次在项目中的实际应用,对此有了一定的认识,特记录如下。

关联表介绍:

分别是属性表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中使用连表查询的一次实际应用的更多相关文章

  1. MyBatis中实现多表查询

    如果查询的数据量大,推荐使用N+1次查询.数据量少使用联合查询... 一. 1.Mybatis是实现多表查询方式 1.1  业务装配:对两个表编写单表查询语句,在业务(Service)把查询的两表结果 ...

  2. Mybatis中的多表查询 多对多

    示例:用户和角色 一个用户可以有多个角色 一个角色可以赋予多个用户 步骤: 1.建立两张表:用户表,角色表 让用户表和角色表具有多对多的关系. 需要使用中间表,中间表中包含各自的主键,在中间表中是外键 ...

  3. Mybatis中的多表查询 多对一,一对多

    示例:用户和账户 一个用户可以有多个账户 一个账户只能属于一个用户(多个账户也可以属于同一个用户) 步骤: 1.建立两张表:用户表,账户表 让用户表和账户表之间具备一对多的关系:需要使用外键在账户表中 ...

  4. Hibernate中的多表查询及抓取策略

    1.Hibernate中的多表查询 1.1SQL中的多表查询 [交叉连接] select * from A,B; [内连接] 显示内连接:inner join(inner 可以省略) Select * ...

  5. mysql中的回表查询与索引覆盖

    了解一下MySQL中的回表查询与索引覆盖. 回表查询 要说回表查询,先要从InnoDB的索引实现说起.InnoDB有两大类索引,一类是聚集索引(Clustered Index),一类是普通索引(Sec ...

  6. Mybatis学习——一对一关联表查询

    1.SQL语句建表 CREATE TABLE teacher( t_id ) ); CREATE TABLE class( c_id ), teacher_id INT ); ALTER TABLE ...

  7. MyBatis总结-实现关联表查询

    一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...

  8. MyBatis学习之多表查询

    一对多需求:即一张表class中又含有多张表(teacher,student)内容.现根据class_id 来获取对应的班级信息(包括学生和老师信息) 方式一:嵌套结果 使用嵌套结果映射来处理重复的联 ...

  9. Oracle中的多表查询

    多表查询 l 笛卡尔积: N*M l 使用关联字段消除笛卡尔积的多余数据: SELECT EMP.*,DEPT.DNAME,DEPT.LOC FROM EMP, DEPT WHERE EMP.DEPT ...

随机推荐

  1. swift--添加新手引导页

    swift和oc逻辑上都是一样的,只是写法不一样,可以使用一个view,也可以使用一个viewController,两种都可以的,使用view注意初始化的时候给他一个frame,vc的话,直接在本控制 ...

  2. Nginx.conf 配置文件详细说明

    在此记录下Nginx服务器nginx.conf的配置文件说明, 部分注释收集与网络. #运行用户user www-data;    #启动进程,通常设置成和cpu的数量相等worker_process ...

  3. java基础---->多线程之Daemon(五)

    在java线程中有两种线程,一种是用户线程,另一种是守护线程.守护线程是一种特殊的线程,当进程中不存在非守护线程了,则守护线程自动销毁.今天我们通过实例来学习一下java中关于守护线程的知识.我是个平 ...

  4. N小时改变一次url时间戳的方法

    //为url添加时间戳//time 为多长时间改变一次时间戳,以小时为单位function setTimeStamp(url, time){    var time = time || 4,      ...

  5. 三、微信小游戏开发 --- 小游戏API调用Platform

    微信小游戏API Platform主要是Egret用于来调用平台的SDK的. 在Egret中使用接口定义Platform. Egret项目中默认的platform值是DebugPlatform. 发布 ...

  6. 知道WCF的地址用工厂通道方式快速调用WCF

    知道WCF的地址用工厂通道方式快速调用WCF  1 using System;  2 using System.ServiceModel;  3 using System.ServiceModel.D ...

  7. java.lang.IllegalArgumentException: Invalid character found in the request target.

    java.lang.IllegalArgumentException: Invalid character found in the request target. http参数存在特殊字符: 特殊字 ...

  8. rest_framework之版本详解 04

    访问不同版本,给不同内容. rest规范:版本要么放url上:要么放请求头里. 1.原来的url的版本都写死了.只能写v1 from django.conf.urls import url from ...

  9. mysql 使用如下三种方式应用where条件,从好到坏

    在索引中使用where条件过滤不匹配的记录,这是在存储引擎层完成的: ​使用索引覆盖扫描(explain语句中的Extra列中出现Using index)来返回记录.直接从索引中过滤掉不需要的记录并返 ...

  10. 'Settings' object has no attribute 'TEMPLATE_DEBUG' 的解决方法

    找到该Django项目下的settings文件,把 DEBUG = True 改为 DEBUG = False 就可以正常浏览显示了 参考:https://stackoverflow.com/ques ...