日期:2014-05-18  浏览次数:20810 次

皱建大哥以及各位大虾,一个想个半个月都没有解决的搜索的问题,帮忙解决下。
手机表有个字段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)


如果要根据功能名称来查, 只需要再关联功能表即可