`
mj4d
  • 浏览: 299842 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

mysql中函数IF,GROUP_CONCAT的使用

阅读更多

mysql中最近用到的函数,记录下

1、IF(expr1,expr2,expr3)与我们常用的三目运算类似。expr1是一个表达式,如果TRUE,返回expr2否则为expr3

如下数据:

INSERT INTO a(id,a,b) VALUES ('1', '1', '1');
INSERT INTO a(id,a,b) VALUES ('2', '1', '0');
INSERT INTO a(id,a,b) VALUES ('3', '1', '0');
INSERT INTO a(id,a,b) VALUES ('4', '1', '0');
INSERT INTO a(id,a,b) VALUES ('5', '0', '0');
INSERT INTO a(id,a,b) VALUES ('6', '0', '1');

比如要查询a的返回状态,1代表是,0代表否有:

SELECT IF(a=1,'是','否') as flag FROM a

有时需要比较两列数据,如同时比较a、b其取值通过(1,1),(1,0),(0,1),(0,0)来统计:

SELECT
SUM(IF (a=1 AND b= 1, 1, 0)) as flag1,
SUM(IF (a=1 AND b= 0, 1, 0)) as flag2,
SUM(IF (a=0 AND b= 1, 1, 0)) as flag3,
SUM(IF (a=0 AND b= 0, 1, 0)) as flag4
FROM a
1	3	1	1
这样就完成了按照类型来统计。

2、GROUP_CONCAT将一组数据中的non-NULL作为串联的字符串返回,常与group在一起使用。简单的说就是行转列,如下数据:
INSERT INTO `table2(id, a)` VALUES ('1', '0');
INSERT INTO `table2(id, a)` VALUES ('1', '1');
INSERT INTO `table2(id, a)` VALUES ('2', '0');
INSERT INTO `table2(id, a)` VALUES ('2', '3');
INSERT INTO `table2(id, a)` VALUES ('1', '4');
这里需要返回
id     a
-----------
1	|0,1,4
2	|0,3
那么我们可以通过该函数来获取
SELECT id, GROUP_CONCAT(a)
FROM table2
GROUP BY id;
来看看GROUP_CONCAT语法:
GROUP_CONCAT([DISTINCT] expr [,expr ...]
             [ORDER BY {unsigned_integer | col_name | expr}
                 [ASC | DESC] [,col_name ...]]
             [SEPARATOR str_val])

参考该函数的doc :可以DISTINCT去重, ORDER BY排序,SEPARATOR 来指定分隔符(默认为“,”)如有下面数据

INSERT INTO `table2(id, a)` VALUES ('1', '0');
INSERT INTO `table2(id, a)` VALUES ('1', '1');
INSERT INTO `table2(id, a)` VALUES ('2', '0');
INSERT INTO `table2(id, a)` VALUES ('2', '3');
INSERT INTO `table2(id, a)` VALUES ('1', '4');
INSERT INTO `table2(id, a)` VALUES ('2', '3');

我们需要显示出来的按照a降序、不能重复:

SELECT id, GROUP_CONCAT(DISTINCT a ORDER BY a DESC SEPARATOR '-')
FROM table2
GROUP BY id;

这样输出结果:

id	a
-----------------------
1	4-1-0
2	3-0

 有了这个函数我们就可以处理一些业务上的事情了,比如现在有两张表其中一张table3的id一对多与另一张表table4的rid关联,现在要统计ipad和mac的具体版本,那么我们就可以直接用sql实现了

-- table3(id,  name)
INSERT INTO `table3(id, name)` VALUES ('1', 'ipad');
INSERT INTO `table3(id, name)` VALUES ('2', 'mac');

-- table4(id,  rid,  name)
INSERT INTO `table4(id, rid, name)` VALUES ('1', '1', 'ipad1');
INSERT INTO `table4(id, rid, name)` VALUES ('2', '1', 'ipad2');
INSERT INTO `table4(id, rid, name)` VALUES ('3', '1', 'ipad3');
INSERT INTO `table4(id, rid, name)` VALUES ('4', '2', 'pro');
INSERT INTO `table4(id, rid, name)` VALUES ('5', '2', 'air');
INSERT INTO `table4(id, rid, name)` VALUES ('6', '2', 'mini');
SELECT 
	a.id,
	a.name,
	GROUP_CONCAT(b.name) as version
FROM table3 a JOIN table4 b ON a.id = b.rid
GROUP BY a.id; 

---
id	name	version
1	ipad	ipad1,ipad2,ipad3
2	mac	pro,air,mini

 

注意事项:

1、连接的长度受group_concat_max_len参数限制,也就是说这个返回这个长度不是所有都会返回,但是默认为1024也很长了,当然具体可能会到当前concat字段的类型限制同时和max_allowed_packet的限制
2、连接返回二进制和非二进制string,依赖当前连接的类型。有可能超过512个后就返回TEXT或BLOB。如果连接的是int或其他最好先转成Char,如使用函数CAST(expr AS type), CONVERT(expr,type),见CAST文档

-- CAST
SELECT CAST(id as CHAR) FROM table4;
-- Convert
SELECT Convert(id, CHAR) FROM table4;
 

 

参考了以下blog

http://blog.sina.com.cn/s/blog_4e808acf01009qna.html

分享到:
评论

相关推荐

    【GROUP_CONCAT】使用之MySQL官方文档翻译

    【GROUP_CONCAT】使用之MySQL官方文档翻译

    MySQL GROUP_CONCAT限制解决方案

    作用:  GROUP_CONCAT函数可以拼接某个字段值成字符串,默认的分隔符是 逗号,即...SHOW VARIABLES LIKE 'group_concat_max_len' 操作方法:(如图) 调整长度设置方法: (1)在MySQL配置文件中加入:  文件:my.ini

    MySQL统计函数GROUP_CONCAT使用陷阱分析

    本文实例分析了MySQL统计函数GROUP_CONCAT使用中的陷阱。分享给大家供大家参考,具体如下: 最近在用MySQL做一些数据的预处理,经常会用到group_concat函数,比如类似下面一条语句 代码如下:mysql>select aid,group...

    如何修改Mysql中group_concat的长度限制

    在mysql中,有个函数叫“group_concat”,平常使用可能发现不了问题,在处理大数据的时候,会发现内容被截取了,其实MYSQL内部对这个是有设置的,默认不设置的长度是1024,如果我们需要更大,就需要手工去修改 ...

    MySQL中group_concat函数深入理解

    本文通过实例介绍了MySQL中的group_concat函数的使用方法,需要的朋友可以适当参考下

    mysql中GROUP_CONCAT的使用方法实例分析

    本文实例讲述了mysql中GROUP_CONCAT的使用方法。分享给大家供大家参考,具体如下: 现在有三个表,结构如下: cate表: CREATE TABLE `cate` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', `...

    Mysql的GROUP_CONCAT()函数使用方法

    语法: GROUP_CONCAT([DISTINCT] expr [,expr …][ORDER BY {unsigned_integer | col_name | expr}[ASC | DESC] [,col_name …]][SEPARATOR str_val]) 下面演示一下这个函数,先建立一个学生选课表...

    mysql的group_concat函数使用示例

    MySQL中group_concat函数,完整的语法如下: 代码如下:group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator ‘分隔符’]) 基本查询 代码如下:select * from aa; 代码如下:+——+——+|...

    mysql group_concat()函数用法总结

    本文实例讲述了mysql group_concat()函数用法。分享给大家供大家参考,具体如下: group_concat(),手册上说明:该函数返回带有来自一个组的连接的非NULL值的字符串结果。比较抽象,难以理解。 通俗点理解,其实是...

    浅谈MySQL中group_concat()函数的排序方法

    group_concat()函数的参数是可以直接使用order by排序的。...以上这篇浅谈MySQL中group_concat()函数的排序方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持软件开发网。

    MySQL拼接字符串函数GROUP_CONCAT详解

    本文给大家详细讲解了MySQL的拼接字符串函数GROUP_CONCAT的几种使用方法以及详细示例,有需要的小伙伴可以参考下

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

    select group_concat(list_name) from aa_list 您可能感兴趣的文章:MySql采用GROUP_CONCAT合并多条数据显示...concat()函数用法总结MySQL统计函数GROUP_CONCAT使用陷阱分析mysql的group_concat函数使用示例MySQL中gro

    mysql group_concat 实现把分组字段写成一行的方法示例

    本文实例讲述了mysql group_concat 实现把分组字段写成一行的方法。分享给大家供大家参考,具体如下: 功能:将group by产生的同一个分组中的值连接起来,返回一个字符串结果。 函数语法: group_concat( [DISTINCT]...

Global site tag (gtag.js) - Google Analytics