美文网首页
MySQL方法GROUP_CONCAT的应用,多对多联表查询,以

MySQL方法GROUP_CONCAT的应用,多对多联表查询,以

作者: 李北北 | 来源:发表于2017-11-27 17:48 被阅读0次

开发中遇到这样的一个需求:用户表为A,小区表为B,用户小区关系通过C表多对多关联,我们需要查询出每一个用户所拥有的小区,以下图的格式显示:

image.png

在解决问题中发现了两种方式可实现该功能,下面直接贴出sql语句

方式一

SELECT
    m.user_id AS userId,
    (
        SELECT
            GROUP_CONCAT(ca.`name` SEPARATOR '、')
        FROM
            common_user_apartment ua
        LEFT JOIN common_apartment ca ON ca.id = ua.apartment_id
        WHERE
            ua.user_id = m.user_id
    ) AS apartmentNames
FROM
    basics_users m
LEFT JOIN common_apartment ca ON ca.id = m.apartment_id
LEFT JOIN common_region cr ON cr.id = ca.city_id
WHERE
    m.isdel = 'N'

方式一是把查询c表作为主表,并且left join B表的一个子查询,查出每一个用户id拥有的小区名称拼接结果作为拥有小区字段值的,我们看看其查询性能

image.png

可见查询一万条左右数据需要17秒左右,这种速度我们显然是不能接受的,而且需要以拥有小区的名称做模糊查询时候也无从下手。于是后来继续想办法优化,就找到了下面的方式二。

方式二

SELECT
    m.user_id AS userId,
    m.user_name AS userName,
    cua.apartmentNames AS apartmentNames
FROM
    basics_users m
LEFT JOIN common_apartment ca ON ca.id = m.apartment_id
LEFT JOIN common_region cr ON cr.id = ca.city_id
LEFT JOIN (
    SELECT
        ua.user_id,
        GROUP_CONCAT(
            ua.apartment_id SEPARATOR ','
        ) AS apartmentIds,
        GROUP_CONCAT(ca.`name` SEPARATOR '、') AS apartmentNames
    FROM
        common_user_apartment ua
    LEFT JOIN common_apartment ca ON ca.id = ua.apartment_id
    GROUP BY
        ua.user_id
) cua ON cua.user_id = m.user_id
WHERE
    m.isdel = 'N';

方式二依然有一个查询用户拥有小区名称拼接结果的子查询,只是这个子查询不是直接作为结果字段返回,而是根据用户id为group规则查询出来每一个用户的拥有小区结果字符串,然后作为A表的left join的虚拟表,下面看一下测试结果

image.png

可见同样查询一万条数据一秒钟都不用,查询速度提高了至少20倍,而且因为是虚拟关联表,可以直接用 cua.apartmentNames LIKE '%小区1%' 而实现模糊查询。

相关文章

  • MySQL方法GROUP_CONCAT的应用,多对多联表查询,以

    开发中遇到这样的一个需求:用户表为A,小区表为B,用户小区关系通过C表多对多关联,我们需要查询出每一个用户所拥有的...

  • MySQL 一对多查询

    导语 这次要实现的是一对多查询,使用 MySQL 的 group_concat 函数实现。 group_conca...

  • mybatis笔记 - 07

    2017 06 18 多对一和一对多关系的查询应用 多对一 关联表查询: 提出需求: 以学生和班级为例 : 站在学...

  • 一对多联表查询

    基本需求是:商品表product 和 属性值表cat_value 之间是一对多关系,要求对商品表中的商品按一到多个...

  • MySQL

    mysql递归查询组织机构mysql 递归查询 MySQL教程之concat以及group_concat的用法 M...

  • mysql表关系

    mysql数据库 知识要点: 单表查询 子查询 联表查询 事务 在进行查询之前,我们要先建好关系表,并往数据表中插...

  • 黑马SQL笔记 - 基础篇 - 4. 多表查询

    多表关系 一对多 多对多 一对一 连接查询 自连接:当前表与自身的连接查询,自连接必须使用表别名内连接:相当于查询...

  • mysql 联表查询

    mysql 联表查询 JOIN 对比 思路: 1.分析需求,分析查询的字段来自哪些表(连接查询) 2.确定使用哪...

  • Mybatis学习笔记(二)

    按照嵌套查询方式进行一对多查询 我的方法:在配置文件中写出一对多查询的sql语句 先看看数据表结构,假设在一个论坛...

  • 杂七杂八的记录

    MYSQL:GROUP_CONCAT(column1):将查询出的多列记录中的一个字段,拼接成使用逗号隔开的一个字...

网友评论

      本文标题:MySQL方法GROUP_CONCAT的应用,多对多联表查询,以

      本文链接:https://www.haomeiwen.com/subject/zrmdbxtx.html