percona教程:MySQL GROUP_CONCAT的使用
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)
- -- Engineers
- CREATE TABLE engineers (
- id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
- e_name VARCHAR(30) NOT NULL,
- e_surname VARCHAR(30) NOT NULL,
- url VARCHAR(255) NOT NULL,
- PRIMARY KEY (id)
- ) ENGINE=InnoDB;
- -- Customers
- CREATE TABLE customers (
- id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
- company_name VARCHAR(30) NOT NULL,
- url VARCHAR(255) NOT NULL,
- PRIMARY KEY (id)
- ) ENGINE=InnoDB;
- -- Issues (Issue-Customer)
- CREATE TABLE issues (
- id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
- customer_id VARCHAR(30) NOT NULL,
- description TEXT,
- PRIMARY KEY (id)
- ) ENGINE=InnoDB;
- -- Workflow (Action: Engineer-Issue(Customer))
- CREATE TABLE workflow (
- action_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
- engineer_id SMALLINT UNSIGNED NOT NULL,
- issue_id SMALLINT UNSIGNED NOT NULL,
- PRIMARY KEY (action_id)
- ) ENGINE=InnoDB;
- INSERT INTO engineers (e_name, e_surname, url)
- VALUES
- ('Miguel', 'Nieto', 'https://www.percona.com/about-us/our-team/miguel-angel-nieto'),
- ('Marcos', 'Albe', 'https://www.percona.com/about-us/our-team/marcos-albe'),
- ('Valerii', 'Kravchuk', 'https://www.percona.com/about-us/our-team/valerii-kravchuk'),
- ('Michael', 'Rikmas', 'https://www.percona.com/about-us/our-team/michael-rikmas');
- INSERT INTO customers (company_name, url)
- VALUES
- ('OT','http://www.ovaistariq.net/'),
- ('PZ','http://www.peterzaitsev.com/'),
- ('VK','http://mysqlentomologist.blogspot.com/'),
- ('FD','http://www.lefred.be/'),
- ('AS','http://mysqlunlimited.blogspot.com/'),
- ('SS','https://www.flamingspork.com/blog/');
- INSERT INTO issues(customer_id, description)
- VALUES
- (1,'Fix replication'),
- (2,'Help with installation of Percona Cluster'),
- (3,'Hardware suggestions'),
- (4,'Error: no space left'),
- (5,'Help with setup daily backup by Xtrabackup'),
- (6,'Poke sales about Support agreement renewal'),
- (4,'Add more accounts for customer'),
- (2,'Create Hot Fix of Bug 1040735'),
- (1,'Query optimisation'),
- (1,'Prepare custom build for Solaris'),
- (2,'explain about Percona Monitoring plugins'),
- (6,'Prepare access for customer servers for future work'),
- (5,'Decribe load balancing for pt-online-schema-change'),
- (4,'Managing deadlocks'),
- (1,'Suggestions about buffer pool size');
- INSERT INTO workflow (engineer_id, issue_id)
- 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)查询出每个工程师需要解决的问题列表:
- SELECT
- CONCAT(e.e_name, ' ', e.e_surname) AS engineer_name,
- GROUP_CONCAT(
- DISTINCT w.issue_id,
- '(',
- c.company_name,
- ')'
- ORDER BY
- w.issue_id
- )
- FROM
- workflow AS w
- LEFT JOIN engineers AS e ON (w.engineer_id = e.id)
- LEFT JOIN issues AS i ON (w.issue_id = i.id)
- LEFT JOIN customers AS c ON (i.customer_id = c.id)
- GROUP BY
- w.engineer_id
- ORDER BY
- engineer_name
结果:
例2)查询出每个客户的问题对应解决的工程师列表:
- SELECT
- c.company_name,
- GROUP_CONCAT(content)
- FROM
- (
- SELECT
- w.issue_id,
- CONCAT(
- w.issue_id,
- '(',
- GROUP_CONCAT(
- CONCAT(e.e_name, ' ', e.e_surname)
- ),
- ')'
- ) AS content
- FROM
- workflow AS w
- LEFT JOIN engineers AS e ON (w.engineer_id = e.id)
- GROUP BY
- w.issue_id
- ) AS t
- LEFT JOIN issues AS i ON (t.issue_id = i.id)
- LEFT JOIN customers AS c ON (i.customer_id = c.id)
- GROUP BY
- c.company_name
结果:
percona教程:MySQL GROUP_CONCAT的使用的更多相关文章
- 分布式监控系统Zabbix-3.0.3-完整安装记录(7)-使用percona监控MySQL
前面已经介绍了分布式监控系统Zabbix-3.0.3-完整安装记录(2)-添加mysql监控,但是没有提供可以直接使用的Key,太过简陋,监控效果不佳.要想更加仔细的监控Mysql,业内同学们都会选择 ...
- zabbix通过第三方插件percona监控mysql数据库
zabbix通过第三方插件percona监控mysql数据库 ...
- Zabbix通过percona监控MySQL
因为Zabbix自带的MySQL监控没有提供可以直接使用的Key,所以一般不采用,业界的同学们都使用Percona Monitoring Plugins 监控 MySQL的方式 Percona介绍 P ...
- 教您如何使用MySQL group_concat函数
MySQL group_concat函数是典型的字符串连接函数,下面就为您介绍MySQL group_concat的语法,希望对您学习MySQL group_concat函数有所帮助. MySQL g ...
- Mysql group_concat函数被截断的问题
mysql group_concat函数被截断的问题 MySQL的 group_concat 函数默认返回1024个字节长度,超过长度的会被截断.最近程序中就遇到这个问题了. 通过如下命令可以查看 ...
- zabbix监控-percona监控MySQL(三)
监控MySQL实战 标签(linux): zabbix & mysql 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 percona为MySQL制作了专 ...
- mysql GROUP_CONCAT 函数 将相同的键的多个单元格合并到一个单元格
mysql GROUP_CONCAT 函数 将相同的键的多个单元格合并到一个单元格 MemberID MemberName FruitName -------------- ------------- ...
- 实现类似mysql group_concat的功能
实现类似mysql group_concat的功能 SELECT SG.Id ,SG.GroupName ,HostNames = STUFF((SELECT ',' + SH.[HostName] ...
- 0213Zabbix通过percona监控MySQL
因为Zabbix自带的MySQL监控没有提供可以直接使用的Key,所以一般不采用,业界的同学们都使用Percona Monitoring Plugins 监控 MySQL的方式 Percona介绍 P ...
随机推荐
- HTML中使用javascript解除禁止input输入框代码:
转:表单中Readonly和Disabled的区别 参考资料: disabled和readonly区别: 参考博文1地址:http://blog.csdn.net/symgdwyh/article/d ...
- .NET开源高性能Socket通信中间件Helios介绍及演示
一:Helios是什么 Helios是一套高性能的Socket通信中间件,使用C#编写.Helios的开发受到Netty的启发,使用非阻塞的事件驱动模型架构来实现高并发高吞吐量.Helios为我们大大 ...
- angularjs的表单验证
angularjs内置了常用的表单验证指令,比如min,require等.下面是演示: <!DOCTYPE html> <html> <head> <meta ...
- 使用toggle()方法进行显示隐藏
这是一个示例: <html> <head> <script type="text/javascript" src="http://keley ...
- Unity3D 5.x 简单实例 - 发射炮弹
1,下载.安装: http://unity3d.com/cn/get-unity/download/archive 建议直接借助 UnityDownloadAssistant 进行安装,根据需要勾选需 ...
- ArcGIS标注
关于ArcGIS的标注问题整理. 要求: 保留小数点后三位, 若原数据小于1(.12345),对小数加0显示 分行显示两个字段值 解决: 右击图层 -- ”properties“(属性) 中选择“la ...
- JavaScript判断变量值简单的方法
今天在看一个动态web表单设计器的时候发现项目中的 一个写法 function sum_total(v){ if (!v) { v= 0; } } !v 这是什么写法?不过可以肯定的是,这是一种判断 ...
- jQuery静态方法globalEval使用和源码分析
Eval函数大家都很熟悉,但是globalEval方法却很少使用,大多数参考手册也没有相关api,下面就对其用法和源码相应介绍: jQuery.globalEval()函数用于全局性地执行一段Java ...
- HTML5进阶段内联标签汇总(小篇)
内联元素,与别人公用一行,但是设置宽高无效.其特点: ①和其他元素都在一行上: ②高,行高及外边距和内边距不可改变: ③宽度就是它的文字或图片的宽度,不可改变 ④内联元素只能容纳文本或者其他内联元素 ...
- Linux安全基础:sed命令的使用
sed 是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作. Sed本质上是一个编辑器,但是它是非交互式的,这点与VIM不同:同时 ...