`
denger
  • 浏览: 356945 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Mysql多对多查询、列合并

阅读更多
表信息
  • 资源表 synsource                                                 199824       rows
  • 产品表 tab_product_detail                                  108              rows
  • 资源与产品多对多的关联表 tab_r_sourmach  1,113,866   rows
以上表均采用MyISAM引擎.

连接测试
   因 为方便用户进行更好的资源的搜索,所以需要将资源数据全部建立索引至Lucene中,希望在Lucene中存储的Document为:
sourceNamefileNamesubjectgradeproducts
英语学生用书第十一册外研新标准.nwe英语小学NP7000 NP6000 NP2300
英语学生用书第十二册外研新标准2.nwe英语小学NP2300

以上前四个字段是属于 synsource表中,而 products 属于 tab_product_detail 表,它们之间的关系由tab_r_sourmach进行中间关联。
一开始想到的是直接使用以下SQL:
select s1.sourid, s1.sourcename , t.product_name from synsource s1 
  left join tab_r_sourmach c 
    on s1.sourid=c.sourid
      left join tab_product_detail t 
        on c.product_id = t.product_id where s1.sourceid=1

5 rows in set (0.45 sec)
sourid sourcename        subjectname product_name
      1 小六上Module07    英语        ND520       
      1 小六上Module07    英语        NP560T      
      1 小六上Module07    英语        NP560+      
      1 小六上Module07    英语        NP360+      

对于以上SQL的结果重复数据的合并处理考虑采用了 GROUP_CONCAT
select s1.*, GROUP_CONCAT(t.product_name SEPARATOR ' ') as product_name
  from tab_synsource s1 
    left join tab_r_sourmach c
      on s1.sourid=c.sourid
        left join tab_product_detail t 
              on c.product_id = t.product_id where s1.sourceid=1

1 row in set (0.31 sec)
sourid sourcename        subjectname product_name 
1 小六上Module07    英语        ND520 NTV518 NP560T NP560+ NP360+

看上去似乎能够满足需求,但是以上只是针对单条数据进行查询,对于数据的批量索引建立的话肯定是直接 limit 500之类的操作。于是去掉以上where加上 limit 10执行之后,半天都执行不出来,估计它先会全部数据连接查询之后再去 limit。
于是先测试一下直接(tab_r_sourmach, tab_product_detail)两表关联看看效率如何:
select c.sourid
from tab_r_sourmach c left join tab_product_detail t 
on  c.product_id = t.product_id  
group  by c.sourid limit 500;

以上语句用时:(5.65 sec)

再加上GROUP_CONCAT试试:
select c.sourid, GROUP_CONCAT(t.product_name SEPARATOR ' ') as products
from tab_r_sourmach c left join tab_product_detail t 
on  c.product_id = t.product_id  
group  by c.sourid limit 800;

输出结果样例:
sourid products
    767 ND520 ND416 NTV518 NP560T NP560+ NP360+
    760 ND550 NP600+ NP9588 NP600

800 rows in set (1.74 sec) , 经过反复测试都发现加上了GROUP_CONCAT 函数比没使用该函数快了五倍多,暂时还不知道为什么。
不过1秒左右对于后台索引建立来说还算能够接受,于是再将以上SQL与 synsource 进行连接测试:
select * from synsource s, (
  select c.sourid,
      GROUP_CONCAT(t.product_name SEPARATOR ' ') 
      from tab_r_sourmach c left join tab_product_detail t 
      on 
      c.product_id = t.product_id 
      group  by c.sourid  limit 1000
    ) as b
where s.sourid = b.sourid;

输出结果样例:
    968 词汇学习-第三级K(参考剑桥少儿英语)   英语        NP600+ NP600
    983 词汇学习-六年级上Unit7(参考湘教版)   英语        ND520 ND416 NTV518 NP560T NP560+ NP360+

1000 rows in set (2.02 sec)


不知道大家对这种情况如何处理的?以上的SQL虽然能够达到目的,不过还是存在不足。

忘说了,在使用MYSQL GROUP_CONCAT函数进行分组连接时,它对字符串的长度连接是有长度限止的,默认的情况的话我发布 products 太长的话会被截断,如果想一劳永逸的话直接在my.cnf 中加入 group_concat_max_len=99999 即可。
分享到:
评论
2 楼 denger 2011-04-15  
java_user 写道
问下,那数据说的是诺亚舟点读机?

1 楼 java_user 2011-04-15  
问下,那数据说的是诺亚舟点读机?

相关推荐

    MySQL查询把多列返回结果集拼装成一个字段

    mysql中有种可以通过join相关操作进行表与表之间的方式查询不同结果集,但是在一对多的情况下,关键查询的结果是多条的.例如:班级和学习的关系,我想很直观的看到班级和学生的情况,列表显示出班级的信息和班级的男生...

    mysql行转列(将同一列下的不同内容的几行数据,转换成几列显示)、列转行、行列汇总、合并显示

    mysql行转列(将同一列下的不同内容的几行数据,转换成几列显示)、列转行、行列汇总、合并显示

    mysql_一列分多行操作,在一个表里的几行数据需要分拆成单行存储到一行中

    mysql_一列分多行操作,在一个表里的几行数据需要分拆成单行存储到一行中,mysql_一列分多行操作,在一个表里的几行数据需要分拆成单行存储到一行中 mysql_一列分多行操作,在一个表里的几行数据需要分拆成单行存储...

    Mysql、oracle、Sybase数据库两列合并成一列的sql语句

    Mysql、oracle、Sybase数据库两列合并成一列的sql语句

    mysql如何将多行数据合并成一行

    MySql采用GROUP_CONCAT合并多条数据显示的方法mysql利用group_concat()合并多行数据到一行mysql如何实现多行查询结果合并成一行关于mysql合并表的详细介绍mysql中合并两个字段的方法分享mysql合并多条记录的单个字段...

    计算机病毒与防护:MYSQL联合查询上.ppt

    单击此处添加标题 * * * * * * * * * * * * 目录页 MYSQL联合查询上 联合查询注入原理-SQL的union查询 SQL中UNION 操作符用于合并两个或多个 SELECT 语句的结果集。UNION 内部的 SELECT 语句必须拥有相同数量的列。...

    MySql基本查询、连接查询、子查询、正则表达查询讲解

    用户可以根据自己对数据的需求,使用不同的查询方式。通过不同的查询方式,可以获得不同的数据。MySQL中是使用SELECT语句来查询数据的。在这一章中将讲解的内容包括。 1、查询语句的基本语法 2、在单表上查询数据 3...

    MySql 5.1 参考手册.chm

    2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL 2.6. 在NetWare中安装MySQL 2.7....

    MySQL 5.1参考手册

    2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL 2.6. 在NetWare中安装MySQL ...

    MySQL 5.1中文手冊

    2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL 2.6. 在NetWare中安装MySQL 2.7....

    高性能MySQL(第3版).part2

    6.3.1一个复杂查询还是多个简单查询201 6.3.2切分查询202 6.3.3分解关联查询203 6.4查询执行的基础204 6.4.1MySQL客户端/服务器通信协议205 6.4.2查询缓存208 6.4.3查询优化处理208 6.4.4查询执行引擎222 ...

    MySQL 5.1官方简体中文参考手册

    2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL 2.6. 在NetWare中安装MySQL ...

    MySQL 5.1参考手册中文版

    2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL 2.6. 在NetWare中安装MySQL ...

    MySQL 5.1参考手册 (中文版)

    2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL 2.6. 在NetWare中安装MySQL 2.7....

    mysql5.1中文手册

    MySQL对标准SQL的扩展 1.8.5. MySQL与标准SQL的差别 1.8.6. MySQL处理约束的方式 2. 安装MySQL 2.1. 一般安装问题 2.1.1. MySQL支持的操作系统 2.1.2. 选择要安装的MySQL分发版 2.1.3. 怎样...

    MYSQL中文手册

    2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL 2.6. 在NetWare中安装MySQL...

    mysql实现合并同一ID对应多条数据的方法

    主要介绍了mysql实现合并同一ID对应多条数据的方法,涉及mysql GROUP_CONCAT函数的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下

    mysql官方中文参考手册

    2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL 2.6. 在NetWare中安装MySQL 2.7....

Global site tag (gtag.js) - Google Analytics