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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值