表名:test
id  name
1   张三
2   李四
3   王五
4   张飞
有一个字符串 "1,2,8";
想实现这样的功能,想通过一条sql查询出来 "1,2,8"这三个id是否都存在于表test当中,

解决方案 »

  1.   

    mysql> select * from test;
    +----+------+
    | id | name |
    +----+------+
    |  1 | 张三 |
    |  2 | 李四 |
    |  3 | 王五 |
    |  4 | 张飞 |
    +----+------+
    4 rows in set (0.00 sec)mysql>
    mysql> select group_concat(id)='1,2,8'
        -> from test
        -> where FIND_IN_SET(id,'1,2,8');
    +--------------------------+
    | group_concat(id)='1,2,8' |
    +--------------------------+
    |                        0 |
    +--------------------------+
    1 row in set (0.00 sec)mysql>
    mysql> select group_concat(id)='1,2,4'
        -> from test
        -> where FIND_IN_SET(id,'1,2,4');
    +--------------------------+
    | group_concat(id)='1,2,4' |
    +--------------------------+
    |                        1 |
    +--------------------------+
    1 row in set (0.00 sec)mysql>
      

  2.   

    谢谢我测试一下,是不是我想要的结果,
    我就是不想把字符串分割成单个sql语句分开查询才想这样的,
      

  3.   


    FIND_IN_SET 不会使用索引,这样速度不是很快,不知道还有没有好的解决办法啊?
      

  4.   


    $result = $db->query_once("SELECT IF((SELECT COUNT(*) FROM test WHERE id IN (1,2,8))=(SELECT LENGTH('1,2,8') - LENGTH(REPLACE('1,2,8', ',', '')) + 1), 1, 0)");
    //您看这个方法有什么bug吗?请问_chm大哥。
      

  5.   

    SELECT IF((SELECT COUNT(*) FROM test WHERE id IN (1,2,8))=( LENGTH('1,2,8') - LENGTH(REPLACE('1,2,8', ',', '')) +1), 1, 0)可以把第二个select 去掉。这样应该没有什么问题。
    如果选出的记录数 = '1,2,3,4"中逗号的数量+1,就说明没有记录都有了。