【问题标题】:Mysql - Where IN clause not select data properlyMysql - Where IN 子句无法正确选择数据
【发布时间】:2014-11-16 06:47:51
【问题描述】:

我有逗号分隔的单引号字符串

  1. select * from demoProject WHERE id IN(1,2,3);

  2. set @ids := "'1,2,3'"; select * from demoProject WHERE id IN(@ids)

第一个查询工作正常,但第二个查询仅获取关联 ID 为“1”的数据。第二个查询我哪里错了?

【问题讨论】:

  • 将所有值分别放在单引号中,例如'1','2'
  • 你正在搜索一个字符串,1 OR 2 OR 3 不等于字符串'1,2,3'
  • @nic 每当您对当前接受的答案有性能问题时,请查看我的。他应该说,他的解决方案不能使用索引。我的情况并非如此。这就是我所说的“唯一方法”的真正含义。

标签: php mysql sql select


【解决方案1】:

这里的问题是你在 IN 语句中插入了一个字符串,所以你得到了条件:id IN('1,2,3')。在这种情况下,您应该使用动态 sql。

同样在 MySQL 中,您可以使用FIND_IN_SET() 函数在逗号分隔的字符串中查找数字。所以它可以在这里提供帮助:

set @ids := "'1,2,3'"; select * from  demoProject WHERE FIND_IN_SET(id,@ids);

【讨论】:

    【解决方案2】:

    尝试更改您的身份证件

    set @ids := "'1,2,3'";
    

    set @ids := "'1','2','3'";
    

    【讨论】:

      【解决方案3】:

      它不起作用,因为@ids 被视为字符串。隐式转换为整数将使您始终只获得第一个数字。

      完成这项工作的唯一方法是使用准备好的语句(在这种情况下必须在存储过程中使用):

      DELIMITER $$
      CREATE PROCEDURE sp_prep_stmt(IN ids int)
      BEGIN
      SET @sql = 'select * from demoProject WHERE id IN(?);';
      PREPARE stmt FROM @sql;
      EXECUTE stmt USING ids;
      DEALLOCATE PREPARE stmt;
      END $$
      DELIMITER ;
      

      然后执行该过程

      CALL sp_prep_stmt('1, 2, 3');
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-07
        • 1970-01-01
        • 2016-05-18
        • 2012-07-19
        • 1970-01-01
        • 2011-08-16
        相关资源
        最近更新 更多