大半夜起来想想这个sql语句的写法,大伙帮我看一下有没有可能用sql写得出来~~比如:  
只有一字段第一条记录:   a,b,c,d,e,f     //字符串用,号格开
第二条记录:   3,4,5,6,d,8
第三条记录:   11,12,13,14,c,8
第四条记录:   21,22,23,24,25,8我想搜出含有"a"或者含有"8"的记录,上面四条都符合条件输出.但我想要的结果是输出:第一条记录,第二条记录,第三条记录第四条记录之所以没有输出,是因为第一条记录中的:a,b,c,d,e,f 没有一个在第四条记录里面.因为第一条记录中有个d与第二条记录也有个d,又因为第一条记录有个c与第三条记录也有个c. 所以符合条件输出.请问这条sql语句怎么写?可以写得出来吗?还是要靠程序来判断?

解决方案 »

  1.   

    如果只是第一条 a,b,c,d,e,f  来检测的话,尚可用SQL语句来实现,但第二条,第三条中的 3,4,5,6 是否也需要考虑? 比如如果第四条是 21,22,3,24,25,8 的话,是否算符要求? 如果算的话,则产生递归,用程序来判断比较方便。
      

  2.   

    如果只针对第一行进行判断,不产生递归则可以如下实现。使用中需要把 select c1 from t2 where c1 like '%a%' or c1 like '%8%' limit 1 改为正确的判断第一条记录的语句。mysql> drop table if exists t2;
    Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> create table t2 (
        ->  id      int not null auto_increment primary key ,
        ->  c1      varchar(50)
        -> );
    Query OK, 0 rows affected (0.11 sec)mysql> insert into t2(c1) values
        ->  ('a,b,c,d,e,f'),
        ->  ('3,4,5,6,d,8'),
        ->  ('11,12,13,14,c,8'),
        ->  ('21,22,23,24,25,8');
    Query OK, 4 rows affected (0.05 sec)
    Records: 4  Duplicates: 0  Warnings: 0mysql> select c1 from t2
        -> where (c1 like '%a%' or c1 like '%8%')
        -> and concat(',',c1,',') regexp concat(',[',replace((select c1 from t2 wher
    e c1 like '%a%' or c1 like '%8%' limit 1),',','|'),'],');
    +-----------------+
    | c1              |
    +-----------------+
    | a,b,c,d,e,f     |
    | 3,4,5,6,d,8     |
    | 11,12,13,14,c,8 |
    +-----------------+
    3 rows in set (0.00 sec)
      

  3.   

    我想搜出含有"a"或者含有"8"的记录,上面四条都符合条件输出.
    SELECT *,CONCAT(',',FF,',') FROM TTZF 
    WHERE CONCAT(',',FF,',') REGEXP ',a,|,8,'第四条记录之所以没有输出,是因为第一条记录中的:a,b,c,d,e,f 没有一个在第四条记录里面. 
    只判断第一条记录?
      

  4.   

    只判断第一条记录:
    select * from ttzf where 
    concat(',',ff,',') regexpconcat(',',
    replace((SELECT ff FROM TTZF 
    WHERE CONCAT(',',FF,',') REGEXP ',a,|,8,'
    limit 1),',','|'),',')
      

  5.   

    WHERE CONCAT(',',FF,',') REGEXP ',a,|,8,' 
    这样是实现准确匹配
      

  6.   

    如果记录中有A123 OR 88F的内容的话,
    这种形式
    like '%a%' or like '%8%'
    有问题
      

  7.   


    谢谢大家,acmain 这很好,就是这样只针对第一行进行判断.
      

  8.   

    select c1 from t2 where c1 like '%a%' or c1 like '%8%'这句不正确吧.
    0,2,5,88,9,6,3
    f,d,g,e,r,t,ef,gg,ad
    这样的数据也被选上了,显然不是题所要求
    用select c1 from t2 where concat(',',c1,',') like '%,a,%' or concat(',',c1,',') like '%,8,%'会解决此问题
      

  9.   

    是的,的确如楼上所说没有考虑这个问题。 可以用楼上的这个方法
    select c1 from t2 where concat(',',c1,',') like '%,a,%' or concat(',',c1,',') like '%,8,%' 来解决。 或者更方便的用FIND_IN_SET()函数。
      

  10.   

    select * from ttzf where concat(',',ff,',') regexp
    concat(',',replace((SELECT ff FROM TTZF
    WHERE CONCAT(',',FF,',') REGEXP ',a,|,8,'
    limit 1),',','|'),',')