跳至主要內容

find_in_set

Jin大约 3 分钟

find_in_set

1、语法

FIND_IN_SET(str,strlist)

  • 第一个参数str是要查找的字符串。
  • 第二个参数strlist是要搜索的逗号分隔的字符串列表。

find_in_set:在集合中查找, 那么我们是怎么在集合中查找的呢?

看这个函数的参数 FIND_IN_SET(str,strlist) 有两个, 一个是str, 一个是strlist

从单词的英文意义上来说, strlist是个那个集合,那么既然是集合,为什么会是个串呢, 所以它应该是有格式要求的。

大概意义就是从strList中找str串, 如果找到了, 就返回找到的那个strlist具体的那个坐标位置,没找到的话返回0, 具体的话看下面的SQL查询。

用法1(用在查询语句中,不常用):

# 返回字符串在字符串组合中的位置(位置从1开始),如果字符串在字符串集合中不存在,那么将返回0
select FIND_IN_SET('2', '1,2'); 返回2,也就是位置是2
select FIND_IN_SET('6', '1'); 返回0,由于strlist中不存在str,所以返回0

用法1(用在where语句中,常用):

select * from t_dept where find_in_set(#{deptId}, path)
注意:如果#{deptId}对应'1',path是'1,2,3',那么该条数据就会返回

2、SQL使用

# 创建表
CREATE TABLE IF NOT EXISTS tb_test1(
	`id` INT(11) NOT NULL auto_increment,
    `name` varchar(255) NOT NULL COMMENT '名字',
    `type` varchar(255) NOT NULL COMMENT '类型: 1表示金卡;2表示银卡;3表示铜卡',
    PRIMARY KEY  (`id`)
)ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = 'FIND_IN_SET使用';

# 新增数据
INSERT INTO tb_test1(name,type) VALUES('edg','1,2,3');
INSERT INTO tb_test1(name,type) VALUES('rng','2,3');
INSERT INTO tb_test1(name,type) VALUES('ig','1,3');

# 查询
SELECT * FROM tb_test1 WHERE FIND_IN_SET('1',type); # 返回type中包含1的记录

查询结果

image-20220914151320371
image-20220914151320371

3、MyBatis中使用

CREATE TABLE IF NOT EXISTS dept(
	`id` INT(11) NOT NULL auto_increment,
    `name` varchar(255) NOT NULL COMMENT '部门名字',
    `user_ids` text DEFAULT NULL COMMENT '部门人员',
     PRIMARY KEY  (`id`)
)ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '部门表';

<resultMap id="ResultMap" type="com.test.entity.dept" >
     <id column="id" property="id" jdbcType="INTEGER" />
     <result column="name" property="name" jdbcType="VARCHAR" />
     <result column="user_ids" property="userIds" jdbcType="VARCHAR" />
     <association property="Users" resultMap="Usesr_map" /> // 在实体类中有List<User> Users
</resultMap>

<sql id="User_Column_List" >
    user.id user_id, user.name user_name
</sql>
    
<resultMap id="Usesr_map" type="com.test.entity.User">
	<id column="user_id" property="id" jdbcType="INTEGER" />
    <result column="user_name" property="name" jdbcType="VARCHAR" />
</resultMap>


<!-- 只返回user_ids中包含的id的user记录 -->
<select id="selectOne" resultMap="ResultMap" parameterType="INTEGER" >
    SELECT
    e.id id,e.name name,e.user_ids user_ids,
    <include refid="User_Column_List"/>
    FROM dept e
    LEFT JOIN User user ON FIND_IN_SET(user.id,e.user_ids)
    WHERE e.id = #{e.id}
</select>

4、对比 in、like的区别

  • find_in_set(str,strlist)函数是用变量,strlist内容是逗号分隔的字符串
  • in后面是要常量,表示一个个罗列,in(‘11’,‘12’,‘13’)
  • like是模糊匹配,find_in_set是精确匹配

5、聚合函数open in new window

通常与GROUP BY子句一起使用以将值分组到子集中。

Name描述
AVG()open in new window返回参数的平均值
BIT_AND()open in new window返回按位与
BIT_OR()open in new window返回按位或
BIT_XOR()open in new window返回按位异或
COUNT()open in new window返回返回行数的计数
COUNT(DISTINCT)open in new window返回多个不同值的计数
GROUP_CONCAT()open in new window返回一个连接的字符串
JSON_ARRAYAGG()open in new window将结果集作为单个 JSON 数组返回
JSON_OBJECTAGG()open in new window将结果集作为单个 JSON 对象返回
MAX()open in new window返回最大值
MIN()open in new window返回最小值
STD()open in new window返回总体标准差
STDDEV()open in new window返回总体标准差
STDDEV_POP()open in new window返回总体标准差
STDDEV_SAMP()open in new window返回样本标准差
SUM()open in new window返回总和
VAR_POP()open in new window返回总体标准方差
VAR_SAMP()open in new window返回样本方差
VARIANCE()open in new window返回总体标准方差

除非另有说明,聚合函数忽略 NULL值。

如果在不包含子句的语句中使用聚合函数 GROUP BY,则相当于对所有行进行分组。有关详细信息,请参阅 第 12.20.3 节,“MySQL 对 GROUP BY 的处理”open in new window

贡献者: Jin