mysql中使用FIND_IN_SET查询在逗号隔开的字符串中符合多个ID的数据

已知:
A表
select A.id from A
id
104
107
108
109
110
111
112
113
114
115
118
165
173

B表
select B.role from B
role
49,51,33,72,88,104
1,74,33,51,43,72,68,70,88,56,57,65,107
76,88,111
123
45
60,80,75,108
109
108
109

要求:查询B表role字段逗号隔开的数据中,包含A表id字段的记录。

方法一:
先查出A表的id,然后在B表中用or find_in_set逐个查询
select B.role from B
where
FIND_IN_SET(‘104’ ,B.role)
or FIND_IN_SET(‘107’ ,B.role)
or FIND_IN_SET(‘108’ ,B.role)
or FIND_IN_SET(‘109’ ,B.role)
or FIND_IN_SET(‘110’ ,B.role)
or FIND_IN_SET(‘111’ ,B.role)
or FIND_IN_SET(‘112’ ,B.role)
or FIND_IN_SET(‘113’ ,B.role)
or FIND_IN_SET(‘114’ ,B.role)
or FIND_IN_SET(‘115’ ,B.role)
or FIND_IN_SET(‘118’ ,B.role)
or FIND_IN_SET(‘165’ ,B.role)
or FIND_IN_SET(‘173’ ,B.role);
方法二:
先将A表查询结果用别名表示,然后将查询结果字段别名作为FIND_IN_SET的第一个参数进行查询
select B.role,t.Aid from B,(select A.id as Aid from A) t
where
FIND_IN_SET(t.tid,B.role)
方法三:
使用大小写敏感的locate函数代替find_in_set;该方法不适用于role字段数据字符串之间有包含关系的数据查询;此方法属投机取巧,目前适应本文测试数据,但大部分情况下达不到目标,不推荐使用
select B.role,t.Aid from B,(select A.id as Aid from A) t
where
locate(t.tid,B.role)>0
查询结果:
49,51,33,72,88,104
1,74,33,51,43,72,68,70,88,56,57,65,107
76,88,111
60,80,75,108
109
108
109

你可能感兴趣的:(MySQL)