zoukankan      html  css  js  c++  java
  • 在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
    );
    

      

  • 相关阅读:
    页面框架布局
    socket、tcp、udp、http 的认识及区别
    servlet验证码的设置
    java换行符
    如何在jsp里禁止session
    EL和JSTL表达式
    C标签
    request与response
    文件上传与下载—>struts
    页面跳转
  • 原文地址:https://www.cnblogs.com/lingyejun/p/9608495.html
Copyright © 2011-2022 走看看