修改一下存储的方式:
甲.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
*/
甲.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
*/
解决方案 »
- 数据库备份文件BAK、怎么打开怎么使用?SQL2008的。
- _variant_t 转化为csting
- 循环的问题
- 想到个sql。。不知道咋写。。。。
- 我想看几天以前的帖子,从那里看?
- 请教一个关于sql的问题
- '****************junglerover(灌木丛)的问题:MSDE2000是否确实是SQL SERVER 2000的免费版本?*********************
- 请教:ms sql server不能释放内存的问题
- 一个关于win xp与win2000数据库的连接问题
- 求问怎么行转列查出来,最好是动态的,可能SQl里面还有聚合函数统计
- 求救!MSDE2000在“添加/删除程序”中无法删除
- 如何连接两个不同地址不同类型数据库中的两个表
select * from table where F like '%3%' or F like '%7%'有多少个写多少个.
这位仁兄,如果LZ的字段有100个,莫非要用100 OR?关注!!!!
3楼的,or like用太多了会不会慢啊~?? 不过我也没实验过
A表存手机
B表存功能
C表存交叉信息(ID:关键字,MobileID:手机ID,FuncID:功能ID),每条记录只记录一个手机的一项功能。
然后用
select * from A where MobileID in (select MobileID in C where FuncID in (3 ,7, …))
扩展的话也最省事A表存手机
B表存功能
C表存功能信息TA:MID
TB:FUNID
C:MID,FUNIDSQL:select * from A where MID in (select MID in C where FuncID in (3 ,7, …))在多or也不怕。。
以下是实现的示例:create table func(id int,[desc] varchar(40))
insert into func values(1,'触摸屏 ')
insert into func values(2,'FM收音 ')
insert into func values(3,'MP3播放 ')
insert into func values(4,'视频播放')
insert into func values(5,'视频拍摄')
insert into func values(6,'GPS功能 ')
insert into func values(7,'A2DP蓝牙立体声')
insert into func values(8,'电子词典')create table mobile(id int,code varchar(4),func varchar(20))
insert into mobile values(1,'甲','1,2,3,5,6' )
insert into mobile values(2,'乙','2,3,4,5,7,8')
insert into mobile values(3,'丙','2,3,5,6,7' )
goselect
distinct a.*
from
mobile a,(select id from func where id in(3,7)) b
where
charindex(','+rtrim(b.id)+',' , ','+a.func+',')>0
go/*
id code func
----------- ---- --------------------
1 甲 1,2,3,5,6
2 乙 2,3,4,5,7,8
3 丙 2,3,5,6,7
*/drop table func,mobile
go
但是给用户删除添加项目相当方便
甲.F="11101100"
乙.F="01111011"
丙.F="01101110"
sql: select * from table
where F&32>0 or F&3>0
如果是经常变化的,大的则为一个关联的单表。
采用一个字段存储的方式如果数据量达到百万级的,采用like及截取字段某段内容,效率上会有问题;另外操作上会有问题,就如你所提的。
就是这意思假如要添加某一些属性 只要修改 甲.f=甲.f | &HF0
其中&HF0 转化二进制就是 "11110000" 就是第五 至 第八个 属性同时赋值
学习中。甲.F="11101100"
乙.F="01111011"
丙.F="01101110"sql: select * from table
where F&32>0 or F&3>0是不是可以个改成
select * from table
where F&35>0?
where F&32>0 or F&3>0
这个去取结果的话,是不是会太慢呀,效率和 in(3,7,.....)比不知道哪个更高,请研究过的朋友说一下。个人觉得分三个表科学又直观,代码也简单,应用也方便,扩展也容易
where F&32>0 or F&3>0应该是 where F&32>0 or F&2>0 或者 where F&34>0 吧效率和 in(3,7,.....)比不知道哪个更高,请研究过的朋友说一下。
而且 赋值 或者 做判断 都只要与1个int类型的值 做位运算就出结果了
3,FM收音
5,MP3播放
7,视频播放1+3 = 4 (4就表示有 1和3的功能)
3+7+1 = 11 (就表示 1和3和7的功能)保存的时候就是一个数,只需要写一个程序转换成这个数就可以了。
先定义一些常量:
0,没有功能=0
1,触摸屏 =1
2,FM收音 =2
3,MP3播放 =4
4,视频播放 =8
5,视频拍摄 =16
6,GPS功能 =32
7,A2DP蓝牙立体声 =64
8,电子词典 =128
n,………… =2^N数据库表就定义2个字段就可以了。手机型号:
功能:存各功能的和(无论怎么组合值都是唯一的)这也是很多场合用户和权限的对应关系的实现方法。
你的要求和这个类似。
0,没有功能=0
1,触摸屏 =1
2,FM收音 =2
3,MP3播放 =4
4,视频播放 =8
5,视频拍摄 =16
6,GPS功能 =32
7,A2DP蓝牙立体声 =64
8,电子词典 =128
n,………… =2^(N-1)根据以上定义的求各手机的功能和
手机甲有功能1,2,3,5,6,=55
手机乙有功能2,3,4,5,7,8=222
手机丙有功能2,3,5,6,7=118下面是伪代码
creat table 手机(型号 nvarchar(10),功能 int)
inset into 手机 values(甲,55)
inset into 手机 values(乙,222)
……………………………………
搜索条件:
select * from 手机 where 功能 & 功能3(对应的常量为4) or 功能 & 功能7 (对应的常量为64)
应该是
搜索条件:
select * from 手机 where 功能 & (功能3+功能7+……)〉0
先定义一些常量:
0,没有功能=0
1,触摸屏 =1
2,FM收音 =2
3,MP3播放 =4
4,视频播放 =8
5,视频拍摄 =16
6,GPS功能 =32
7,A2DP蓝牙立体声 =64
8,电子词典 =128
n,………… =2^N正解。
用位运算即可,效率很高,存储所用的空间也小。
第一范式(1NF):在关系模式R中的每一个具体关系r中,如果每个属性值 都是不可再分的最小数据单位,则称R是第一范式的关系。
老兄说的很对
产品表(产品id, 产品名称)
产品功能表(功能id, 产品id)查询的时候, 只需要用类似这样的查询:
select * from 产品表 a
where exists(
select * from 产品功能表
where 功能id in(3, 7)
and 产品id = a.产品id)
如果要根据功能名称来查, 只需要再关联功能表即可
select * from table where substring(f,3,1)=1 or substring(f,7,1)=1
建议调整表设计, 而不是在查询上做文章, 否则数据量一大, 你的服务器就撑不了功能表(功能id, 功能名称)
产品表(产品id, 产品名称)
产品功能表(功能id, 产品id)查询的时候, 只需要用类似这样的查询:
select * from 产品表 a
where exists(
select * from 产品功能表
where 功能id in(3, 7)
and 产品id = a.产品id)
如果要根据功能名称来查, 只需要再关联功能表即可
===============================zjcxc(邹建)
这个是比较灵活
但是我有一个疑问,
如果有10万件产品,每件产品都有10个功能
那么中间的 产品功能表 就是 100万条记录
如果产品增加到100万条呢
那中间的就是1000万条记录了
这样中间那个 产品功能表 是不是太大了,SELECT 起来会不会有点因为自己也需要设计类似的产品数据库,所以望回复,