您的位置:首页 > 数据库 > MySQL

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

2017-04-24 18:27 871 查看
已知:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息