第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没有研究过