热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

mysql中函数IF,GROUP_CONCAT的使用

mysql中函数IF,GROUP_CONCAT的使用mysql中最近用到的函数,记录下www.2cto.com1、IF(expr1,expr2,expr3)与我们常用的三目运算类似。expr1是一个表达式,如果TRUE,返回expr2否则为expr3如下数据:Sql代码I...S

mysql中函数IF,GROUP_CONCAT的使用
 
mysql中最近用到的函数,记录下  www.2cto.com  
1、IF(expr1,expr2,expr3)与我们常用的三目运算类似。expr1是一个表达式,如果TRUE,返回expr2否则为expr3
如下数据:
Sql代码  
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代表否有:
Sql代码  
SELECT IF(a=1,'是','否') as flag FROM a  
有时需要比较两列数据,如同时比较a、b其取值通过(1,1),(1,0),(0,1),(0,0)来统计:
Java代码  
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  
Java代码  
1   3   1   1  
这样就完成了按照类型来统计。
 
2、GROUP_CONCAT将一组数据中的non-NULL作为串联的字符串返回,常与group在一起使用。简单的说就是行转列,如下数据:
Sql代码  
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');  
这里需要返回
Sql代码  
id     a  
-----------  
1   |0,1,4  
2   |0,3  
那么我们可以通过该函数来获取
Sql代码  
SELECT id, GROUP_CONCAT(a)  
FROM table2  
GROUP BY id;  
来看看GROUP_CONCAT语法:
Sql代码  
GROUP_CONCAT([DISTINCT] expr [,expr ...]  
             [ORDER BY {unsigned_integer | col_name | expr}  
                 [ASC | DESC] [,col_name ...]]  
             [SEPARATOR str_val])  
参考该函数的doc :可以DISTINCT去重, ORDER BY排序,SEPARATOR 来指定分隔符(默认为“,”)如有下面数据
Java代码  
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降序、不能重复:
Sql代码  
SELECT id, GROUP_CONCAT(DISTINCT a ORDER BY a DESC SEPARATOR '-')  
FROM table2  
GROUP BY id;  
  www.2cto.com  
这样输出结果:
Sql代码  
id  a  
-----------------------  
1   4-1-0  
2   3-0  
 有了这个函数我们就可以处理一些业务上的事情了,比如现在有两张表其中一张table3的id一对多与另一张表table4的rid关联,现在要统计ipad和mac的具体版本,那么我们就可以直接用sql实现了
Java代码  
-- 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');  
Sql代码  
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文档
Java代码  
-- CAST  
SELECT CAST(id as CHAR) FROM table4;  
-- Convert  
SELECT Convert(id, CHAR) FROM table4;  
 

推荐阅读
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 本文探讨了适用于Spring Boot应用程序的Web版SQL管理工具,这些工具不仅支持H2数据库,还能够处理MySQL和Oracle等主流数据库的表结构修改。 ... [详细]
  • 本文详细介绍了如何通过多种编程语言(如PHP、JSP)实现网站与MySQL数据库的连接,包括创建数据库、表的基本操作,以及数据的读取和写入方法。 ... [详细]
  • 本文介绍如何通过创建替代插入触发器,使对视图的插入操作能够正确更新相关的基本表。涉及的表包括:飞机(Aircraft)、员工(Employee)和认证(Certification)。 ... [详细]
  • MySQL缓存机制深度解析
    本文详细探讨了MySQL的缓存机制,包括主从复制、读写分离以及缓存同步策略等内容。通过理解这些概念和技术,读者可以更好地优化数据库性能。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • 本文详细介绍了 MySQL 中 LAST_INSERT_ID() 函数的使用方法及其工作原理,包括如何获取最后一个插入记录的自增 ID、多行插入时的行为以及在不同客户端环境下的表现。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • 探讨一个老旧 PHP MySQL 系统中,时间戳字段不定期出现异常值的问题及其可能原因。 ... [详细]
  • MLB正式开放可穿戴技术的应用
    据知情人士透露,美国职业棒球大联盟(MLB)计划在当前赛季内引入两款先进的可穿戴设备,旨在提升球员健康管理和性能分析能力。这两款设备分别是能够测量肘关节压力的Motus袖套和能监控心跳与呼吸速率的Zephyr Bioharness。 ... [详细]
author-avatar
消失得珍贵_Cjh_662
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有