这种问题很常见,不知有何好的处理方法。
例如用户表中,有一个“兴趣爱好”字段,用户可以选择多个值,例如“足球,篮球,旅游,运动”等,这个字段记录了这些爱好的ID,值为“0101,0102,03,01”,分别对应“足球,篮球,旅游,运动”,注意,运动和足球、篮球有包含关系,那么
1、如何查询出喜欢足球的用户呢?如果查询出喜欢运动的用户呢?某个属性是多个值的情况经常用“,”隔开存放在一个表中,然而想查询时就很麻烦,如何取出其中有某个或某几个值的记录呢?2、不采用","分隔多值,而用另外的关联表存放,这样设计更好吗?

解决方案 »

  1.   

        在同一个表中也可以啊!在建表的时候为兴趣爱好设一个ID号,比如运动ID为1,娱乐ID为2。篮球、足球有一个ParentID就对应运动的ID,如果要查寻运动的只要把ID和parentID对应就好了!
    楼主看一下可不可以
      

  2.   

    不想用in,like 就写个sql split方法!
    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
      

  3.   

    对于第一个问题,采用条件语句可以实现:
    select * from tablename where charindex(',0101,',','+兴趣爱好字段名+',')>0
    这可以取出兴趣爱好为足球的所有ID。对多个兴趣爱好的查询可以在where后使用or或者and来实现,看你的要求了。对大类如运动可类似的处理。
    对于第二个问题,楼主根据你的实际情况可以决定。
      

  4.   

    对,可以前后拼上“,”然后再做like检索
      

  5.   

    足球好说,就是like '%0101%'
    运动呢,就麻烦了,兴趣爱好 like '01%' or 兴趣爱好 like '%,01%'会更好。不光为了避免查询的麻烦,还为了更新。
    总而言之,为了范式。
      

  6.   

    谢谢,magong总结的非常好,voice1122这种charindex好象只有sqlserver可用。njkzc的自定义函数跨数据库上应该也不行吧。谢谢大家!我想了解这种多值信息最佳的数据库设计方式,看来没有最佳,或者不同情况下最佳也不同,如果经常需要有这种查询,那最好设计一个关联表,如果仅用于存储,那么用","隔开放在一个字段中就行。是这样吧?
      

  7.   


    我用的sql server,呵呵