多选择筛选查询SQL语句怎么写

我现在实现这个筛选查询呢?筛选的数据我都存在一个字段里面,怎么实现,多选不同选择怎么筛选出存在一个字段里面的匹配的数据呢?数据库用到是MYSQL,我用IN( )函数,这个是一个查询多个,也用过FIND_IN_SET()函数,这个是多个查询单个,都不行,请大神指教。

我做过类似的查询,就是用字典项表的数据id列,与数据表的字符串列做instr比较,比较时,两个数据分别在前后加',',防止第一个和最后一个字典项无法查找出来。
举个例子,数据表

字典表 dict
id name
12 wifi
13 冰箱
14 洗衣机
15 电视

业务表 query_table
id query_str
1 12,13,14,15
2 12,14
3 14,15

SELECT *
FROM dict a,query_table b
WHERE INSTR(CONCAT(CONCAT(',',b.query_str),','), CONCAT(',', CONCAT(a.id,',')))>-0 AND b.id=1


看实际效果

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-07-27
看你的选择感觉上应该是“选择的全部”,比如,我选了wifi,餐桌,麻将机,那么就必须这三个都有,其他的有或没有不重要,重要的是这三个,也就是说“选择的全部”。
方法想到了三个:
(1)用like+and,无非是 字段 like '%15%' and 字段 like '%17%' and ……,有多少个选择写多少个like,然后根据传进来的参数截取(这部分最好是应该是前台完成,当然写成过程也可以),然后再导入数据库查询。(这个重复查询多,估计效率不会太快)
(2) 直接like也可以,只是这种需要临时拼凑语句,前面的select不说,where后面是:字段 like '%15%21%31%……',把数字中间填上%,这部分要么改变语句传输的间隔符号,要么做一下替换. (个人比较推荐这种方式,但是这种方式要注意排序,顺序是不能乱的,否则查不出来)
(3)你说的in应该不行,至少我不会,但是FIND_IN_SET可以考虑,和like+and差不多,只是又多了一层判断,而且会出现大量的"不等于0",个人觉得并不会十分好用。本回答被网友采纳
第2个回答  2019-07-26
数据库操作用什么?如果是用mybatis的话可以写循环一个一个遍历,如下:
<!-- 注意返回的数据类型是集合中保存的数据类型 Employee-->
<select id="getEmpsByConditions" resultType="com.jas.mybatis.bean.Employee">
SELECT * FROM t_employee WHERE id IN
<!--
collection:指定要遍历的集合
item:取出当前集合中元素,赋给 item 中的值
separator:遍历出的多个元素之间用什么分隔符分隔开
open:遍历集合前用什么字符进行拼接
close:遍历集合后用什么字符进行拼接
在 foreach 标签中还有一个属性 index,
遍历集合的时候 index 表示的是当前元素的索引,item 对应索引中的值
遍历 map 的时候 index 表示的是当前 map 中的 key,item 是 key 对应的 value
-->
<foreach collection="list" item="empId" separator="," open="(" close=")">
#{empId}
</foreach>
</select>
如果是其他的就在实现层进行遍历。
第3个回答  2019-07-26
用行列转换吧把fac这字段拆分为多行数据,或者用存储过程执行动态sql比如
begin
declare @t nvarchar(100),@sql nvarchar(100);
set @t= (select '1,2,3,11,12,13' as c)
set @sql='select * from (
select ''1,2,3,11,12,13'' a,''1'' b
union all
select ''21,22,23,4,5,6'' a,''2'' b ) t1'
execute(@sql+' where ''1'' in ('+@t+')')
end
这个只是例子,根据实际情况改用,在sql sever中有个xml可以进行行列转换拆分的。mysql没有研究过
第4个回答  2019-07-26
一个字段的筛选条件用模糊查询就行了,你字段里的数字都是排序的,可以用like
比如facilities like '%条件值1%条件值2%条件值3%'