mysql不知有没有IN和FIND_IN_SET的结合方法?
大概的要求:
查询条件: 
$sort_id = '11,21,23'; 查询表: 
id sort 
1 11,22 
2 21,23 
3 50,60 
4 23,60 查询结果: 
id sort 
1 11,22 
2 21,23 
4 23,60 ID 3 ,没有任何匹配,所以未被列出。 请问这样的MYSQL语句应该怎么写?find_in_set('11,21,23',sort )查了下手册,并不可以这样子的

解决方案 »

  1.   

    可以使用MySQL中的正则表达式mysql> drop table if exists t5;
    Query OK, 0 rows affected (0.05 sec)mysql> create table t5 (id int,sort varchar(30));
    Query OK, 0 rows affected (0.09 sec)mysql> insert into t5 values
        -> (1 ,'11,22'),
        -> (2 ,'21,23'),
        -> (3 ,'50,60'),
        -> (4 ,'23,60');
    Query OK, 4 rows affected (0.05 sec)
    Records: 4  Duplicates: 0  Warnings: 0mysql> set @sort_id = '11,21,23';
    Query OK, 0 rows affected (0.00 sec)mysql> select * from t5 where sort regexp replace(@sort_id,',','|');
    +------+-------+
    | id   | sort  |
    +------+-------+
    |    1 | 11,22 |
    |    2 | 21,23 |
    |    4 | 23,60 |
    +------+-------+
    3 rows in set (0.06 sec)mysql>
      

  2.   

    如果为了避免  123,124,145 匹配 23,24则在两边补上,mysql> select * from t5 where concat(',',sort,',') regexp  concat(',',replace(@sort_id,',',',|,'),',');
    +------+-------+
    | id   | sort  |
    +------+-------+
    |    1 | 11,22 |
    |    2 | 21,23 |
    |    4 | 23,60 |
    +------+-------+
    3 rows in set (0.00 sec)mysql> set @sort_id = '11,21,3';
    Query OK, 0 rows affected (0.00 sec)mysql> select * from t5 where concat(',',sort,',') regexp  concat(',',replace(@sort_id,',',',|,'),',');
    +------+-------+
    | id   | sort  |
    +------+-------+
    |    1 | 11,22 |
    |    2 | 21,23 |
    +------+-------+
    2 rows in set (0.00 sec)mysql>
      

  3.   

    谢谢 ACMAIN_CHM强人,正则是可以达到这个要求,但可能是我表达不正确,具体要求是这样的:在首页上有一个轮播层,我需要从数据表article里调取每个类的前一条出来,按时间
    我现在是用了三次查询,感觉有点弱智,article
    id  sortid
    1   3,4
    2   2,3,7
    3   12,17,19
    4   1,2,6,21我现在想用(3,6,17)这三个类id分别调出各属于它的一篇文章,希望能一个语句完成
    如:共需调三条记录,3、6及17各有一条属于它的记录,不知可有办法?
      

  4.   


    要求大概就是这样:表的数据:
    id  sortid    
    1   3,4
    2   2,3,7
    3   12,17,19
    4   1,2,6,21固定要取的类别ID :3,6,17
    我现在的做法是:
    SELECT id,title FROM article WHERE find_in_set('3',sortid) ORDER BY adddate Desc LIMIT 1
    SELECT id,title FROM article WHERE find_in_set('6',sortid) ORDER BY adddate Desc LIMIT 1
    SELECT id,title FROM article WHERE find_in_set('17',sortid) ORDER BY adddate Desc LIMIT 1然后还要判断让它们不能为相同的
      

  5.   

    因为这个分类id是parent关系类型的,所有类别id全在一起才不好搞,不然就可用IN(3,6,7)语句了
      

  6.   

    5楼的测试用例,用二楼的方法就可以了。 能不能准备一套数据能够体现出二楼方法不对的例子。这样比较容易理解秋修改SQL语句。
      

  7.   

    已经回答过多次了,用正则表达式
    select * from tt where concat(',',sort,',') regexp  concat(',',replace('3,6,17',',',',|,'),',');这是准确匹配
      

  8.   

    谢谢二位的回复,2楼的语法是可行的,但它取出来的记录有可能三条都只是一个类别的文章,我要确保3,6,17的类id能各取出一条不同的文章,还要按这个3,6,17的排序输出,我也觉得有点强人所难,再看下有没有更妙的语句,实在不行也只能用ajax调了
      

  9.   

    不知道有没有办法。准备一套数据能够体现出二楼方法不对的例子。这样比较容易理解秋修改SQL语句。如果需要的话,我需要你提供一套的测试数据,然后说明算法和预期的结果。否则很难凭空在不知道你想做什么情况下去想什么SQL语句。
      

  10.   

    算了,暂时用ajax取好了,有需要再向你请教,再次谢谢ACMAIN_CHM