我的已知条件是一个字符串(可编程拆分):'[a],[b],[c],[d]'Mysql数据表中的数据也是一个字符串为:
id      str
1   '[a],[b],[c]'      三条都有,选中
2   '[a],[b],[d]'      三条都有,选中
3   '[a],[b],[c],[e]'  [e]不存在,不能选中即输出:
id      str
1   '[a],[b],[c]' 
2   '[a],[b],[d]'  不用存储过程,怎样才能高效快速的得到这个结果呢?
请各位大虾不吝指教,谢谢

解决方案 »

  1.   

    拆分 
    [a],[b],[c]

    [a]
    [b]
    [c]再判断是否都在[a],[b],[c],[d] 中
      

  2.   

    不好意思,我就是想不出怎么用sql语句拆分[a],[b],[c],好像没看到有哪个函数能拆分的,如果用substr()就必须用存储过程循环了,可是我这里不能用存储过程的,能详细一点吗?谢谢!
      

  3.   

    http://blog.csdn.net/acmain_chm/article/details/4141864
      

  4.   

    建立 LSB,字段ID,内容1-100000 
    示例:
    字符间隔为*,自行修改SELECT *,SUBSTRING_INDEX(
    SUBSTRING_INDEX(a1.SUBJECT,'*',b.id),'*',-1)
     FROM a a1 LEFT JOIN lsb b
    ON (LENGTH(a1.SUBJECT)-LENGTH(REPLACE(a1.SUBJECT,'*','')))+1>=b.id;
      

  5.   

    mysql> select * from  lzgame;
    +------+-----------------+
    | id   | str             |
    +------+-----------------+
    |    1 | [a],[b],[c]     |
    |    2 | [a],[b],[d]     |
    |    3 | [a],[b],[c],[e] |
    +------+-----------------+
    3 rows in set (0.00 sec)mysql> select * from lzgame
        -> where str regexp concat('^([[][',replace(replace(replace(@x,',',''),']',''),'[',''),'][]],?)*$');
    +------+-------------+
    | id   | str         |
    +------+-------------+
    |    1 | [a],[b],[c] |
    |    2 | [a],[b],[d] |
    +------+-------------+
    2 rows in set (0.00 sec)mysql>
      

  6.   

    @x 就是你的 :'[a],[b],[c],[d]'mysql> set @x = '[a],[b],[c],[d]';
    Query OK, 0 rows affected (0.00 sec)mysql>
      

  7.   

    您好,我看了一下您的正则表达式是 ^([[][abcd][]],?)*$,可是我实际的数据可能是[杭州],[上海],[北京],也就是表达式成了^([[][杭州上海北京][]],?)*$,[杭州上海北京]好像是断成一个个单字的,好像依然是错误的,能再帮我指导一下吗?
      

  8.   

    select  *
    from tb
    where col1 regexp replace('[a],[b],[c],[d]',',','|')
    replace函数里面的'[a],[b],[c],[d]'字符串即是你的已知字符串
      

  9.   

    实际数据请看一下:
    id        citys
     6      [杭州],[上海],[北京]                对
     7      [杭州],[西安],[北京]                错
     8      [杭州],[上海]                          对
     9      [杭州],[上海],[南京]                错
    10     [杭州],[上海],[北京],[南京]      错
    比如我要找[杭州],[上海],[北京]是指该数据只能包含在这三个城市以内
    因为要用到"与" ,不知道字符串正则该怎么写?请帮忙再看一下
      

  10.   

    楼主,你这是浪费别人的时间!举例时请使用有实际意义的例子。某则只会是这样,别人花时间做出来的东西,对你来说结果是根本没用。提供你的 create table 语句, insert into 语句, 及测试要求结果。
      

  11.   

    对不起,确实是我不对,一开始没想到用正则,本来只想借鉴一下sql语句的;
    我把表贴上来,请帮我再看一下,谢谢了!
    create table test(
       id                   bigint not null auto_increment,
       citys                 varchar(200),
       primary key (id)
    );
    insert into test(citys) value('[杭州],[上海],[北京]');
    insert into test(citys) value('[杭州],[西安],[北京]');
    insert into test(citys) value('[杭州],[上海]');
    insert into test(citys) value('[杭州],[上海],[南京]');
    insert into test(citys) value('[杭州],[上海],[北京],[南京]');要求输入条件:[杭州],[上海],[北京];
    希望输出:
    id | citys
      1 | [杭州],[上海],[北京]
      3 | [杭州],[上海]
    也就是该数据只能包含在输入的[杭州],[上海],[北京]城市以内浪费了您的时间,深表歉意
      

  12.   

    还有正则字符串我可以程序生成,不用在sql中生成,可以简单一点,谢谢
      

  13.   

    借鉴了您的思路,实现了以下方案,谢谢!
    纯用mysql的方案:select test.id,test.citys from (SELECT *, (LENGTH(test.citys)-LENGTH(REPLACE(test.citys,',','')))+1 len from test ) test join (
    select id,sum(find) a from (
    select test.*,a.len,find_in_set(a.a,'[杭州],[上海],[北京]')>0 find from test inner join (
    SELECT test.*,SUBSTRING_INDEX(SUBSTRING_INDEX(test.citys,',',b.id),',',-1) a FROM (
    SELECT *, (LENGTH(test.citys)-LENGTH(REPLACE(test.citys,',','')))+1 len from test
    ) test LEFT JOIN lsb b ON test.len>=b.id
    ) a on test.id=a.id
    ) a group by id
    ) i on test.id = i.id
    where test.len=i.a;用程序拆分好输入数据的方案:select id ,citys,len 
    from (
    SELECT *, (LENGTH(test.citys)-LENGTH(REPLACE(test.citys,',','')))+1 len 
    from test
    ) test 
    where len<=3 and 
    ((find_in_set('[杭州]',citys)>0)+(find_in_set('[上海]',citys)>0)
    +(find_in_set('[北京]',citys)>0)) =len;
    谢谢"WWWWA"大大,但因为要生成全部字段的len字段,感觉会效率比较低,依然期待"ACMAIN_CHM"大大能指导一下正则的方案,谢谢!
      

  14.   

    已经解决了,最终结果为:select * from test where citys regexp '^([[](杭州|上海|北京)[]],?)*$';
    感谢"WWWWA"大大和"ACMAIN_CHM"大大的指导,谢谢!