2011-11-02 52 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會保持它的漂亮和整潔,而不會出現醜陋的字符串連接。