mysql中FIND_IN_SET()和GROUP_CONCAT()的使用
知识点:mysql中FIND_IN_SET和GROUP_CONCAT()的使用
(一) 场景:当我们使用mysql数据库,查询一张的数据,其中的一列存放的是是另一张表id用“,”拼接的字符串
如下图所示:
person表:

hobby表:

我们前端页面想展示(把person表hobby一栏存放hobby表id字符串改成name连接的字符串):

(二) sql
这时我们可以使用mysql中的两个函数FIND_IN_SET()和GROUP_CONCAT()
sql如下:
SELECT p.id, p.`name`,GROUP_CONCAT(h.`name`) as hobby from person p
LEFT JOIN hobby h ON FIND_IN_SET(h.id,p.hobby)
GROUP BY p.id
(三)那 mysql中FIND_IN_SET()和GROUP_CONCAT() 分别是什么意思呢?
(1)FIND_IN_SET()
语法: FIND_IN_SET(str,strlist)
定义: (1)如果字符串str在由N子链组成的字符串列表中,则返回值范围在1-N之间
如:select FIND_IN_SET('c','a,b,c,d') 返回值为 3
(2)如果str不在strlist中或者strlist为空字符串,则返回值为 0
如:select FIND_IN_SET('e','a,b,c,d') 返回值为 0
select FIND_IN_SET('e','') 返回值为 0
(3)如果任意一个参数为NULL,返回NULL
如:select FIND_IN_SET('e',NULL),返回值为NULL
使用:在下面表中,如果我们想查询人员爱好弹琴的所有人员的话,该怎么查询呢?

我们可以这样写sql:
SELECT * from
(SELECT p.id, p.`name`,GROUP_CONCAT(h.`name`) as hobby from person p
LEFT JOIN hobby h ON FIND_IN_SET(h.id,p.hobby)
GROUP BY p.id) person1
WHERE FIND_IN_SET("弹琴",hobby)
查询结果:

补充使用 in的话,场景不适用
(2)GROUP_CONCAT()
语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc] [separator '分隔符'])
功能:将group by产生的同一分组中的值连接起来,返回一个字符串结果
例如 a.表 person1 数据如下:查询相同爱好的所有人的名字

sql:
SELECT GROUP_CONCAT(name),hobby from person1 GROUP BY hobby
查询结果:

b.查询相同爱好的人员的id,按照从大到小,用“_”拼接
sql:
SELECT GROUP_CONCAT(id order by id desc separator '_' ),hobby from person1 GROUP BY hobby
查询结果:

mysql中FIND_IN_SET()和GROUP_CONCAT()的使用的更多相关文章
- mysql中find_in_set结合GROUP_CONCAT使用
SELECT stationid from sys_workstation where FIND_IN_SET(stationid,(SELECT GROUP_CONCAT(opera_area) f ...
- mysql 中find_in_set()和in()用法比较
mysql 中find_in_set()和in()用法比较 在mysql中in可以包括指定的数字,而find_in_set()用于特定的数据类型. find_in_set 函数使用方法 个例子来说:有 ...
- Mysql中FIND_IN_SET()和IN区别简析
来源:http://www.jb51.net/article/125744.htm 测试SQL: CREATE TABLE `test` ( `id` int(8) NOT NULL auto_inc ...
- mysql中FIND_IN_SET函数用法
本篇文章主要介绍mysql中FIND_IN_SET函数用法,用来精确查询字段中以逗号分隔的数据 以及其与 like 和 in 的区别 1.问题发现 之前在做工作任务时有这么一个需求:需要用接口所传的服 ...
- mysql中find_in_set()函数的使用
首先举个例子来说: 有个文章表里面有个type字段,它存储的是文章类型,有 1头条.2推荐.3热点.4图文等等 .现在有篇文章他既是头条,又是热点,还是图文,type中以 1,3,4 的格式存储.那我 ...
- mysql中FIND_IN_SET的使用方法
在mysql中,有时我们在做数据库查询时,需要得到某字段中包含某个值的记录,但是它也不是用like能解决的,使用like可能查到我们不想要的记录,它比like更精准,这时候mysql的FIND_IN_ ...
- 浅析MySQL中concat以及group_concat的使用
说明: 本文中使用的例子均在下面的数据库表tt2下执行: 一.concat()函数 1.功能:将多个字符串连接成一个字符串. 2.语法:concat(str1, str2,...) 返回结果为连接 ...
- Mysql中contact、group_concat、concat_ws、repeat
一.CONCAT(str1,str2,…) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL. mysql> select concat('11','22',' ...
- mysql中concat 和 group_concat()的用法
一.CONCAT()函数CONCAT()函数用于将多个字符串连接成一个字符串.使用数据表Info作为示例,其中SELECT id,name FROM info LIMIT 1;的返回结果为+----+ ...
随机推荐
- Matlab批量获取子文件夹与文件名
批量得到父文件夹下所有子文件夹的路径的MATLAB函数. function [SubFolders] = GetFolders(ParentFolder) %GetFolders % 函数功能为获取父 ...
- VMware虚拟机中CentOS7的硬盘空间扩容
查看centos7系统挂载点信息 扩展VMWare-centos7硬盘空间 对新增加的硬盘进行分区.格式化 添加新LVM到已有的LVM组,实现扩容 1.查看centos7系统挂载点信息 df -h查看 ...
- Spark简介 --大数据
一.Spark是什么? 快速且通用的集群计算平台 二.Spark的特点: 快速:Spark扩充流行的Mapreduce计算模型,是基于内存的计算 通用:Spark的设计容纳了其它分布式系统拥有的功能, ...
- django认证01---token
1.登录鉴权跟 Token 的鉴权区别 以 Django 的账号密码登录为例来说明传统的验证鉴权方式是怎么工作的,当我们登录页面输入账号密码提交表单后,会发送请求给服务器,服务器对发送过来的账号密码进 ...
- Redis 常用命令学四:列表类型命令
1.在列表两端增加值的命令 127.0.0.1:6379> lpush 1 (error) ERR wrong number of arguments for 'lpush' command 1 ...
- JVM -- 虚拟机中的对象
一.HotSpot虚拟机 它是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机.我们大致知道虚拟机内存的概况,也许更想了解这些虚拟机内存的数据的其他细节,誓如它们是如 ...
- LeetCode_#1_两数之和 Two Sum_C++题解
1. 两数之和 Two Sum 题目描述 Given an array of integers, return indices of the two numbers such that they ad ...
- Python 基础教程 | 菜鸟教程
https://www.runoob.com/python/python-install.html
- POSIX异步I/O接口使用
POSIX1003.1b 实时扩展协议规定的标准异步 I/O 接口,即 aio_read 函数. aio_write 函数.aio_fsync 函数.aio_cancel 函数.aio_error 函 ...
- jq使用ajax请求,返回状态 canceled错误
在使用jq,ajax请求时出现该错误 原因:button按钮类型为type=submit ,script中又自定用botton按钮点击提交ajax,造成冲突. 解决方法:button按钮类型改为 ty ...