Mysql 利用FIND_IN_SET实现字符串模拟where in语句
前言:
今天在项目中开发中遇到一个特殊的问题,需要用字符串来实现数据库where in的情况。该字符串格式如下:'2866,345,352,361',需要我去表中根据其ID依次查询出对应的关系来;
想象中的语句应该是将 '2866,345,352,361' 分割成数组,然后用where in ('2866','345','352','361') 来实现数据查询;但是我发现Mysql的FIND_IN_SET函数可以实现这种情况模拟;
1.SQL如下:
select FIND_IN_SET(dept_id,'2866,345,352,361') as findInSet,t.dept_id,t.dept_name from sys_dept t where FIND_IN_SET(dept_id,'2866,345,352,361')
2.查询数据结果:
这样就可以直接套用字符串实现where in的情况了
3.如果我要是表与表之间进行这种关联,该如何实现呢?
首先我们可以添加一些虚拟的数据,来模拟该情况的发生:
##创建用户表
CREATE TABLE sys_user ( user_id INT COMMENT '用户id', dept_id VARCHAR ( 100 ) COMMENT '部门id', user_name VARCHAR ( 100 ) COMMENT '用户名' ) COMMENT = '用户表';
##添加用户
INSERT INTO sys_user ( user_id,dept_id, user_name )
VALUES( 1, '1,2,3', '张三' ),( 2, '2,3,4', '李四' );
##创建部门表
CREATE TABLE sys_dept (dept_id int COMMENT '部门id', dept_name VARCHAR ( 100 ) COMMENT '部门名' ) COMMENT = '部门表';
##添加部门
INSERT INTO sys_dept ( dept_id, dept_name )
VALUES( 1, '部门1'),( 2, '部门2' ),( 3, '部门3' ),( 4, '部门4' );
执行完后数据如下:
用户表
部门表
开始组装SQL语句:
注:只有在保证用户唯一时,才能用FIND_IN_SET,不然查询结果不是想要的
SELECT
u.*,
d.*
FROM
sys_user u,
sys_dept d
WHERE
FIND_IN_SET( d.dept_id, u.dept_id )
AND user_id=1 ##只有在保证用户唯一时,才能用FIND_IN_SET,不然查询结果可能不是自己想要的
再配合GROUP_CONCAT函数,消除以上用户一对多的情况:
SELECT
u.*,
GROUP_CONCAT(d.dept_name) as dept_name
FROM
sys_user u,
sys_dept d
WHERE
FIND_IN_SET( d.dept_id, u.dept_id )
AND user_id=1 ##只有在保证用户唯一时,才能用FIND_IN_SET,不然查询结果可能不是自己想要的
如有不足欢迎留言!!!