percona有一篇blog: The power of MySQL GROUP_CONCAT 比较详细地介绍了GROUP_CONCAT函数的用法。简单地翻译了一下。


假设你有4名工程师,这周他们为6名客户解决了15个问题。他们之间彼此协作,如何展示他们之间的逻辑关系呢?我是这么做的:

译者的sql与原文给出的sql有些许的差异,不过核心思想是一致的。

创建表:

  • 工程师表 engineers (id, name, surname, URL)
  • 客户表 customers (id, company name, URL)
  • 问题表 issues (id, customer_id, description)
  • 工作流 workflow (id, engineer_id, issue_id)
  1. -- Engineers
  2. CREATE TABLE engineers (
  3. id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
  4. e_name VARCHAR(30) NOT NULL,
  5. e_surname VARCHAR(30) NOT NULL,
  6. url VARCHAR(255) NOT NULL,
  7. PRIMARY KEY (id)
  8. ) ENGINE=InnoDB;
  9. -- Customers
  10. CREATE TABLE customers (
  11. id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
  12. company_name VARCHAR(30) NOT NULL,
  13. url VARCHAR(255) NOT NULL,
  14. PRIMARY KEY (id)
  15. ) ENGINE=InnoDB;
  16. -- Issues (Issue-Customer)
  17. CREATE TABLE issues (
  18. id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
  19. customer_id VARCHAR(30) NOT NULL,
  20. description TEXT,
  21. PRIMARY KEY (id)
  22. ) ENGINE=InnoDB;
  23. -- Workflow (Action: Engineer-Issue(Customer))
  24. CREATE TABLE workflow (
  25. action_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  26. engineer_id SMALLINT UNSIGNED NOT NULL,
  27. issue_id SMALLINT UNSIGNED NOT NULL,
  28. PRIMARY KEY (action_id)
  29. ) ENGINE=InnoDB;
  30. INSERT INTO engineers (e_name, e_surname, url)
  31. VALUES
  32. ('Miguel', 'Nieto', 'https://www.percona.com/about-us/our-team/miguel-angel-nieto'),
  33. ('Marcos', 'Albe', 'https://www.percona.com/about-us/our-team/marcos-albe'),
  34. ('Valerii', 'Kravchuk', 'https://www.percona.com/about-us/our-team/valerii-kravchuk'),
  35. ('Michael', 'Rikmas', 'https://www.percona.com/about-us/our-team/michael-rikmas');
  36. INSERT INTO customers (company_name, url)
  37. VALUES
  38. ('OT','http://www.ovaistariq.net/'),
  39. ('PZ','http://www.peterzaitsev.com/'),
  40. ('VK','http://mysqlentomologist.blogspot.com/'),
  41. ('FD','http://www.lefred.be/'),
  42. ('AS','http://mysqlunlimited.blogspot.com/'),
  43. ('SS','https://www.flamingspork.com/blog/');
  44. INSERT INTO issues(customer_id, description)
  45. VALUES
  46. (1,'Fix replication'),
  47. (2,'Help with installation of Percona Cluster'),
  48. (3,'Hardware suggestions'),
  49. (4,'Error: no space left'),
  50. (5,'Help with setup daily backup by Xtrabackup'),
  51. (6,'Poke sales about Support agreement renewal'),
  52. (4,'Add more accounts for customer'),
  53. (2,'Create Hot Fix of Bug 1040735'),
  54. (1,'Query optimisation'),
  55. (1,'Prepare custom build for Solaris'),
  56. (2,'explain about Percona Monitoring plugins'),
  57. (6,'Prepare access for customer servers for future work'),
  58. (5,'Decribe load balancing for pt-online-schema-change'),
  59. (4,'Managing deadlocks'),
  60. (1,'Suggestions about buffer pool size');
  61. INSERT INTO workflow (engineer_id, issue_id)
  62. VALUES (1,1),(4,2),(2,3),(1,4),(3,5),(2,6),(3,7),(2,8),(2,9),(1,10),(3,11),(2,12),(2,13),(3,14),(1,15),(1,9),(4,14),(2,9),(1,15),(3,10),(4,2),(2,15),(4,8),(4,4),(3,11),(1,7),(3,7),(1,1),(1,9),(3,4),(4,3),(1,5),(1,7),(1,4),(2,4),(2,5);

例1)查询出每个工程师需要解决的问题列表:

  1. SELECT
  2. CONCAT(e.e_name, ' ', e.e_surname) AS engineer_name,
  3. GROUP_CONCAT(
  4. DISTINCT w.issue_id,
  5. '(',
  6. c.company_name,
  7. ')'
  8. ORDER BY
  9. w.issue_id
  10. )
  11. FROM
  12. workflow AS w
  13. LEFT JOIN engineers AS e ON (w.engineer_id = e.id)
  14. LEFT JOIN issues AS i ON (w.issue_id = i.id)
  15. LEFT JOIN customers AS c ON (i.customer_id = c.id)
  16. GROUP BY
  17. w.engineer_id
  18. ORDER BY
  19. engineer_name

结果:

例2)查询出每个客户的问题对应解决的工程师列表:

  1. SELECT
  2. c.company_name,
  3. GROUP_CONCAT(content)
  4. FROM
  5. (
  6. SELECT
  7. w.issue_id,
  8. CONCAT(
  9. w.issue_id,
  10. '(',
  11. GROUP_CONCAT(
  12. CONCAT(e.e_name, ' ', e.e_surname)
  13. ),
  14. ')'
  15. ) AS content
  16. FROM
  17. workflow AS w
  18. LEFT JOIN engineers AS e ON (w.engineer_id = e.id)
  19. GROUP BY
  20. w.issue_id
  21. ) AS t
  22. LEFT JOIN issues AS i ON (t.issue_id = i.id)
  23. LEFT JOIN customers AS c ON (i.customer_id = c.id)
  24. GROUP BY
  25. c.company_name

结果:

percona教程:MySQL GROUP_CONCAT的使用的更多相关文章

  1. 分布式监控系统Zabbix-3.0.3-完整安装记录(7)-使用percona监控MySQL

    前面已经介绍了分布式监控系统Zabbix-3.0.3-完整安装记录(2)-添加mysql监控,但是没有提供可以直接使用的Key,太过简陋,监控效果不佳.要想更加仔细的监控Mysql,业内同学们都会选择 ...

  2. zabbix通过第三方插件percona监控mysql数据库

     zabbix通过第三方插件percona监控mysql数据库                                                                     ...

  3. Zabbix通过percona监控MySQL

    因为Zabbix自带的MySQL监控没有提供可以直接使用的Key,所以一般不采用,业界的同学们都使用Percona Monitoring Plugins 监控 MySQL的方式 Percona介绍 P ...

  4. 教您如何使用MySQL group_concat函数

    MySQL group_concat函数是典型的字符串连接函数,下面就为您介绍MySQL group_concat的语法,希望对您学习MySQL group_concat函数有所帮助. MySQL g ...

  5. Mysql group_concat函数被截断的问题

    mysql group_concat函数被截断的问题   MySQL的 group_concat 函数默认返回1024个字节长度,超过长度的会被截断.最近程序中就遇到这个问题了. 通过如下命令可以查看 ...

  6. zabbix监控-percona监控MySQL(三)

    监控MySQL实战 标签(linux): zabbix & mysql 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 percona为MySQL制作了专 ...

  7. mysql GROUP_CONCAT 函数 将相同的键的多个单元格合并到一个单元格

    mysql GROUP_CONCAT 函数 将相同的键的多个单元格合并到一个单元格 MemberID MemberName FruitName -------------- ------------- ...

  8. 实现类似mysql group_concat的功能

    实现类似mysql group_concat的功能 SELECT SG.Id ,SG.GroupName ,HostNames = STUFF((SELECT ',' + SH.[HostName] ...

  9. 0213Zabbix通过percona监控MySQL

    因为Zabbix自带的MySQL监控没有提供可以直接使用的Key,所以一般不采用,业界的同学们都使用Percona Monitoring Plugins 监控 MySQL的方式 Percona介绍 P ...

随机推荐

  1. HTML中使用javascript解除禁止input输入框代码:

    转:表单中Readonly和Disabled的区别 参考资料: disabled和readonly区别: 参考博文1地址:http://blog.csdn.net/symgdwyh/article/d ...

  2. .NET开源高性能Socket通信中间件Helios介绍及演示

    一:Helios是什么 Helios是一套高性能的Socket通信中间件,使用C#编写.Helios的开发受到Netty的启发,使用非阻塞的事件驱动模型架构来实现高并发高吞吐量.Helios为我们大大 ...

  3. angularjs的表单验证

    angularjs内置了常用的表单验证指令,比如min,require等.下面是演示: <!DOCTYPE html> <html> <head> <meta ...

  4. 使用toggle()方法进行显示隐藏

    这是一个示例: <html> <head> <script type="text/javascript" src="http://keley ...

  5. Unity3D 5.x 简单实例 - 发射炮弹

    1,下载.安装: http://unity3d.com/cn/get-unity/download/archive 建议直接借助 UnityDownloadAssistant 进行安装,根据需要勾选需 ...

  6. ArcGIS标注

    关于ArcGIS的标注问题整理. 要求: 保留小数点后三位, 若原数据小于1(.12345),对小数加0显示 分行显示两个字段值 解决: 右击图层 -- ”properties“(属性) 中选择“la ...

  7. JavaScript判断变量值简单的方法

    今天在看一个动态web表单设计器的时候发现项目中的 一个写法 function sum_total(v){ if (!v) { v= 0; } } !v  这是什么写法?不过可以肯定的是,这是一种判断 ...

  8. jQuery静态方法globalEval使用和源码分析

    Eval函数大家都很熟悉,但是globalEval方法却很少使用,大多数参考手册也没有相关api,下面就对其用法和源码相应介绍: jQuery.globalEval()函数用于全局性地执行一段Java ...

  9. HTML5进阶段内联标签汇总(小篇)

    内联元素,与别人公用一行,但是设置宽高无效.其特点: ①和其他元素都在一行上: ②高,行高及外边距和内边距不可改变: ③宽度就是它的文字或图片的宽度,不可改变 ④内联元素只能容纳文本或者其他内联元素 ...

  10. Linux安全基础:sed命令的使用

    sed 是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作. Sed本质上是一个编辑器,但是它是非交互式的,这点与VIM不同:同时 ...