某表记录是这样的
id title cid
100  张三 2,3
101  李四 3,4
102  王五 12,13如果搜索,条件是要查cid字段=2的记录应该怎么写?sql语句里的like应该不严谨,可能会把100和102这两条记录都查出来

解决方案 »

  1.   

    SELECT * FROM table WHERE FIND_IN_SET('2',cid);
      

  2.   

    mysql> select find_in_set(2, "2,3,4");
    +-------------------------+
    | find_in_set(2, "2,3,4") |
    +-------------------------+
    |                       1 |
    +-------------------------+
    1 row in set (0.00 sec)mysql> select find_in_set(2, "52,3,4");
    +--------------------------+
    | find_in_set(2, "52,3,4") |
    +--------------------------+
    |                        0 |
    +--------------------------+
    1 row in set (0.00 sec)mysql> select find_in_set(2, "2,3,4"); 
    +-------------------------+
    | find_in_set(2, "2,3,4") |
    +-------------------------+
    |                       1 |
    +-------------------------+
    1 row in set (0.00 sec)
      

  3.   

    给你贴说明:FIND_IN_SET(str,strlist)
    如果字符串str在由N子串组成的表strlist之中,返回一个1到N的值。一个字符串表是被“,”分隔的子串组成的一个字符串。如果第一个参数是一个常数字符串并且第二个参数是一种类型为SET的列,FIND_IN_SET()函数被优化而使用位运算!如果str不是在strlist里面或如果strlist是空字符串,返回0。如果任何一个参数是NULL,返回NULL。如果第一个参数包含一个“,”,该函数将工作不正常。
    mysql> SELECT FIND_IN_SET('b','a,b,c,d');
            -> 2
      

  4.   

    是否合理其实得看功能需求,比如要实现文章tag功能的时候,这样设计还是需要的,每篇文章有不固定数量的标签,把标签id用逗号分隔组成字符串存储,和标签表关联起来,方便了标签的查询和管理