这种问题很常见,不知有何好的处理方法。
例如用户表中,有一个“兴趣爱好”字段,用户可以选择多个值,例如“足球,篮球,旅游,运动”等,这个字段记录了这些爱好的ID,值为“0101,0102,03,01”,分别对应“足球,篮球,旅游,运动”,注意,运动和足球、篮球有包含关系,那么
1、如何查询出喜欢足球的用户呢?如果查询出喜欢运动的用户呢?某个属性是多个值的情况经常用“,”隔开存放在一个表中,然而想查询时就很麻烦,如何取出其中有某个或某几个值的记录呢?2、不采用","分隔多值,而用另外的关联表存放,这样设计更好吗?
例如用户表中,有一个“兴趣爱好”字段,用户可以选择多个值,例如“足球,篮球,旅游,运动”等,这个字段记录了这些爱好的ID,值为“0101,0102,03,01”,分别对应“足球,篮球,旅游,运动”,注意,运动和足球、篮球有包含关系,那么
1、如何查询出喜欢足球的用户呢?如果查询出喜欢运动的用户呢?某个属性是多个值的情况经常用“,”隔开存放在一个表中,然而想查询时就很麻烦,如何取出其中有某个或某几个值的记录呢?2、不采用","分隔多值,而用另外的关联表存放,这样设计更好吗?
楼主看一下可不可以
ALTER function f_split(@SourceSql varchar(8000),@StrSeprate varchar(10))
returns @temp table(a varchar(100))
--实现split功能 的函数
--date :2003-10-14
--@SourceSql 0101,0102,03,01
--@StrSeprate ,
as
begin
declare @i int
set @SourceSql=rtrim(ltrim(@SourceSql))
set @i=charindex(@StrSeprate,@SourceSql)
while @i>=1
begin
insert @temp values(left(@SourceSql,@i-1))
set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
set @i=charindex(@StrSeprate,@SourceSql)
end
if @SourceSql<>''
insert @temp values(@SourceSql)
return
end
select * from tablename where charindex(',0101,',','+兴趣爱好字段名+',')>0
这可以取出兴趣爱好为足球的所有ID。对多个兴趣爱好的查询可以在where后使用or或者and来实现,看你的要求了。对大类如运动可类似的处理。
对于第二个问题,楼主根据你的实际情况可以决定。
运动呢,就麻烦了,兴趣爱好 like '01%' or 兴趣爱好 like '%,01%'会更好。不光为了避免查询的麻烦,还为了更新。
总而言之,为了范式。
我用的sql server,呵呵