【问题标题】:MYSQL Delete Where Field is Not Part of ArrayMYSQL删除字段不是数组的一部分
【发布时间】:2011-12-20 13:41:29
【问题描述】:

我有一个表“groupdentlink”,我想在其中删除所有未在表单中检查的行。

本质上我想执行如下查询:

DELETE * FROM groupdentlink
WHERE group_id = 'a'
AND dentist_id IS NOT IN ARRAY 'b'

我想我可以使用 foreach 循环设置一个变量,然后继续向其中添加数组值,因此我最终得到:

DELETE * FROM groupdentlink
WHERE group_id = 'a'
AND dentist_id != 'D1'
AND dentist_id != 'D5'
AND dentist_id != 'D8'

...等等。

但这真的是正确/最好的方法吗?

提前致谢!

【问题讨论】:

  • 等等,即使那个解决方案也抛出了一个语法错误......嗯。

标签: php mysql arrays


【解决方案1】:
DELETE FROM groupdentlink
WHERE group_id = 'a'
AND dentist_id NOT IN ('D1','D5','D8')

更多信息在这里http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_not-in

【讨论】:

  • 感谢您的帮助。我知道我现在很接近了,但是这个查询出现语法错误:DELETE * FROM groupdentlink WHERE group_id = 'a' AND dentin_id NOT IN ('UTG1','UTG10','UTG100')
  • DELETE * FROM -> DELETE FROM。我也没有看到这个:)
【解决方案2】:

您只需要用逗号加入 id:

$myarray = new array('D1', 'D5', 'D8');
$str = "";
foreach ($myarray as $item)
{
    $str .= $item . ",";
}
$str = rtrim($str, ",");

$query = "DELETE * FROM groupdentlink
             WHERE group_id = 'a'
             AND dentist_id NOT IN ($str)";

这会给你一个这样的查询:

DELETE * FROM groupdentlink
    WHERE group_id = 'a'
    AND dentist_id IS NOT IN (D1, D5, D8);

如果您需要在 id 周围加上引号,请像这样更改循环:

foreach ($myarray as $item)
{
    $str .= "'".$item . "',";
}

【讨论】:

  • 达尼特。谢谢您的帮助。我收到此查询的语法错误:DELETE * FROM groupdentlink WHERE group_id = 'a' AND dentin_id IS NOT IN ('UTG1','UTG10','UTG100')
【解决方案3】:

Stack Exchange 的新用户,如果我犯了失礼,请原谅并指出。

前面的答案非常危险,因为它使您容易受到 SQL 注入攻击。

始终使用绑定参数。

始终使用绑定参数。

始终使用绑定参数。

提示:如果您的查询不类似于“DELETE * FROM groupdentlink WHERE group_id = 'a' AND dentin_id IS NOT IN (?, ?, ?);”你做错了。

【讨论】:

    【解决方案4】:

    如果您想从 Zend Framework 驱动的应用程序执行此查询,请考虑以下几点:

    $where = sprintf('dentist_id NOT IN ("%s")', implode('", "',array_map('mysql_escape_string', $array))); 
    $this->sqlMapper->delete($where);
    

    如果你尝试 .用于连接目的的运算符,由于引号,查询将导致致命错误。因此,根据我使用 htmlspecialchars 或 htmlencode 以及 .运营商只会消耗你的时间和耐心。 sprintf 的使用很优雅,可以帮助您保持代码整洁。

    我认为这些观察适用于任何使用 php 对象的应用程序。

    【讨论】:

      【解决方案5】:

      我找到了$str = rtrim($str, ",");的声明
      没有删除尾随逗号导致 错误
      我想出了这个解决方法:

      // 不带引号的字符串

      $str = array_shift($array);
      

      // 带引号的字符串

      $str = "'" . array_shift($array) . "'";
      



      foreach ($array as $item)
      {
      
          $str .= ", '" . $item . "'";
      
      }
      

      【讨论】:

      • 这真的回答了这个问题吗?
      【解决方案6】:

      一个优雅的、完全参数化的解决方案(使用 PDO):

      $dentistIds = ['D1', 'D5', 'D8'];
      
      $query = sprintf(
          "DELETE FROM online_order_shipping
                 WHERE group_id = 'a'
                   AND dentist_id NOT IN (%s)",
          implode(',', array_fill(0, count($dentistIds), '?'))
      );
      
      $stmtDelete = $pdo->prepare($query);
      $stmtDelete->execute($dentistIds);
      

      implode 函数将?, 连在一起,末尾不加逗号(source)。您可以将其转换为一个函数以使其更具可读性,否则 sprintf 会保持它的美观和整洁,而不会出现难看的字符串连接。

      【讨论】:

        【解决方案7】:

        这里我是怎么做的:

        assuming you have an array called $csvstocknumbers = ['0','1']; $stocknumbers = implode(",",$csvstocknumbers) ; // make the content of the array in one string seprated by , $deleteoldvehicles = "DELETE FROM table_name WHERE column_name NOT IN
        ($stocknumbers ) ;"; mysqli_query($con, $deleteoldvehicles);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-09-02
          • 1970-01-01
          • 1970-01-01
          • 2021-12-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多