2011-11-02 53 views
8

我有一个表“groupdentlink”,我想删除所有未在表单中检查的行。MYSQL删除其中字段不是阵列的一部分

在本质上我想执行类似的查询:

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' 

...等等。

但这真的是最好的方法吗?

在此先感谢!

+0

等一下,即使这个解决方案是抛出语法错误......嗯。 –

回答

15
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

PHP语法:

$array = Array('D1','D5','D8'); 
$sql = " 
DELETE FROM 
    groupdentlink 
WHERE 
    group_id='a' AND 
    dentist_id NOT IN ('".join("','", $array)."')"; 
mysql_query($sql); 
+0

感谢您的帮助。我知道我现在很近,但得到此查询的语法错误:DELETE * FROM groupdentlink WHERE group_id ='a'AND dentist_id NOT IN('UTG1','UTG10','UTG100') –

+0

'DELETE * FROM' - >'DELETE FROM'。我没有看到这个:) – Peter

+0

请接受我的回答http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – Peter

0

你只需要使用逗号加入IDS:

$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 . "',"; 
} 
+0

Darnit。谢谢您的帮助。我收到此查询的语法错误:DELETE * FROM groupdentlink WHERE group_id ='a' AND dentist_id不在('UTG1','UTG10','UTG100') –

+0

将'IS NOT IN'更改为'NOT IN' - 我已经更新了我的答案。 – swatkins

0

新用户堆栈兑换,请原谅,并指示如果我犯了失礼。

前面的答案是非常危险的,因为它会让你面临SQL注入攻击。

始终使用绑定参数。

始终使用绑定参数。

始终使用绑定参数。

提示:如果您的查询不像“DELETE * FROM groupdentlink WHERE group_id ='a'AND dentist_id is not IN(?,?,?);”你做错了。

2

如果要执行从Zend框架驱动的应用程序此查询请以考虑如下:

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

如果你尝试。为了连接目的,该查询将由于引号而导致致命错误。所以从我使用htmlspecialchars或htmlencode的经验。运营商只会消耗你的时间和耐心。 sprintf的使用非常优雅,可帮助您保持代码清洁。

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

0

我发现的声明$str = rtrim($str, ",");
didnt删除尾随逗号掀起了一股 错误
我这项工作围绕想出了:

//字符串不带引号

$str = array_shift($array); 

//带引号的字符串

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



foreach ($array as $item) 
{ 

    $str .= ", '" . $item . "'"; 

} 
+0

这是否真的回答了这个问题? – Nippey

0

优雅,完全参数化的溶液(使用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会保持它的漂亮和整洁,而不会出现丑陋的字符串连接。