皱建大哥以及各位大虾,一个想个半个月都没有解决的搜索的问题,帮忙解决下。
手机表有个字段F表示可能拥有的高级功能:
1,触摸屏
2,FM收音
3,MP3播放
4,视频播放
5,视频拍摄
6,GPS功能
7,A2DP蓝牙立体声
8,电子词典
…………
手机甲有功能1,2,3,5,6,
手机乙有功能2,3,4,5,7,8
手机丙有功能2,3,5,6,7
我是这样存在数据库里面的
甲.F= "1,1,1,0,1,1,0,0 "
乙.F= "0,1,1,1,1,0,1,1 "
丙.F= "0,1,1,0,1,1,1,0 "
就是如果有对应的功能就是1,没有就是0
现在我要搜索所有含有功能3或者7,
注意,这里是 或
我的意思是只要改手机含功能3,或者含功能7的都属于匹配的结果
sql: select * from table
where
((F like '_,_,3,_,_,_,_,_, ') or (F like '_,_,_,_,_,_,7,_, '))
问题出来了, 这里用户只勾选了功能3和功能7,我用可以用一个or表示出来
但是如果用户勾选了10个功能或者50个功能,我不可能用50个or吧
想了很长时间,不知道怎么觉得
也许根本就是我这中存取数据的方式就是错误的
望各位大虾赐教
怎么样才能高效的达到这种搜索的目的~
------解决方案--------------------修改一下存储的方式:
甲.F= "1,2,3,5,6 "
乙.F= "2,3,4,5,7,8 "
丙.F= "2,3,5,6,7 "
-------------------------
declare @t table(id int,code varchar(4),func varchar(20))
insert into @t select 1, '甲 ', '1,2,3,5,6 '
insert into @t select 1, '乙 ', '2,3,4,5,7,8 '
insert into @t select 1, '丙 ', '2,3,5,6,7 '
select
distinct a.*
from
@t a,
(select '3 ' as func union select '7 ') b
where
charindex( ', '+b.func+ ', ' , ', '+a.func+ ', ')> 0
/*
id code func
----------- ---- --------------------
1 丙 2,3,5,6,7
1 甲 1,2,3,5,6
1 乙 2,3,4,5,7,8
*/
------解决方案--------------------建议调整表设计, 而不是在查询上做文章, 否则数据量一大, 你的服务器就撑不了
功能表(功能id, 功能名称)
产品表(产品id, 产品名称)
产品功能表(功能id, 产品id)
查询的时候, 只需要用类似这样的查询:
select * from 产品表 a
where exists(
select * from 产品功能表
where 功能id in(3, 7)
and 产品id = a.产品id)
如果要根据功能名称来查, 只需要再关联功能表即可