2011-11-02 22 views
8

Tôi có một bảng "groupdentlink" nơi tôi muốn xóa tất cả các hàng không được chọn trong biểu mẫu.MYSQL Xóa Trường ở đâu không phải là một phần của mảng

Về bản chất tôi muốn thực hiện một truy vấn như:

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

Tôi nghĩ rằng tôi có thể thiết lập một biến với một vòng lặp foreach và sau đó tiếp tục bổ sung các giá trị mảng đến nó vì vậy tôi kết thúc với:

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

... v.v.

Nhưng đây thực sự là cách tốt nhất/tốt nhất để làm điều này?

Cảm ơn trước!

+0

Đợi, ngay cả giải pháp đó cũng đang ném một lỗi cú pháp ... hmmm. –

Trả lời

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

Thông tin thêm ở đây http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_not-in

PHP Cú pháp:

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

Cảm ơn sự giúp đỡ. Tôi biết tôi sắp đóng, nhưng nhận được lỗi cú pháp với truy vấn này: DELETE * FROM groupdentlink WHERE group_id = 'a' VÀ dentist_id NOT IN ('UTG1', 'UTG10', 'UTG100') –

+0

'DELETE * FROM' - > 'DELETE FROM'. Tôi cũng không thấy điều này :) – Peter

+0

Vui lòng chấp nhận câu trả lời của tôi http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – Peter

0

Bạn chỉ cần tham gia các id với một dấu phẩy:

$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)"; 

này sẽ cung cấp cho bạn một truy vấn như này:

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

Nếu bạn cần dấu ngoặc kép quanh id, sau đó thay đổi vòng lặp như thế này:

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

Darnit. Cảm ơn đã giúp đỡ. Tôi nhận được lỗi cú pháp với truy vấn này: DELETE * FROM groupdentlink WHERE group_id = 'a' VÀ dentist_id KHÔNG PHẢI LÀ ('UTG1', 'UTG10', 'UTG100') –

+0

thay đổi 'KHÔNG PHẢI IN' thành 'KHÔNG IN' - Tôi đã cập nhật câu trả lời của mình. – swatkins

0

Người dùng mới để Stack Exchange, xin vui lòng tha thứ và hướng dẫn nếu tôi phạm một giả pas.

Câu trả lời trước là vô cùng nguy hiểm, vì nó mở ra cho bạn các tấn công SQL injection.

Luôn sử dụng thông số liên kết.

Luôn sử dụng thông số liên kết.

Luôn sử dụng thông số liên kết.

Gợi ý: nếu truy vấn của bạn không giống "DELETE * FROM groupdentlink WHERE group_id = 'a' AND dentist_id IS NOT IN (?,?,?);" bạn đang làm sai.

2

Nếu bạn muốn thực hiện truy vấn này từ một ứng dụng điều khiển Zend Framework hãy trong việc xem xét các nội dung sau:

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

Nếu bạn cố gắng. nhà điều hành cho các mục đích ghép nối truy vấn sẽ dẫn đến một lỗi nghiêm trọng vì các dấu ngoặc kép. Vì vậy, từ kinh nghiệm của tôi bằng cách sử dụng htmlspecialchars hoặc htmlencode cùng với. nhà điều hành sẽ chỉ tiêu tốn thời gian và kiên nhẫn của bạn. Việc sử dụng sprintf là thanh lịch, giúp bạn giữ mã của bạn sạch sẽ.

Và tôi nghĩ rằng những quan sát này áp dụng cho bất kỳ ứng dụng nào sử dụng các đối tượng php.

0

tôi thấy báo cáo kết quả $str = rtrim($str, ",");
didnt loại bỏ sự trỗi dậy dấu phẩy đưa ra một lỗi
tôi đến với công việc này xung quanh:

// chuỗi mà không có dấu ngoặc kép

$str = array_shift($array); 

// chuỗi có trích dẫn

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



foreach ($array as $item) 
{ 

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

} 
+0

Điều này thực sự trả lời câu hỏi? – Nippey

0

kiểu dáng trang nhã, giải pháp hoàn toàn parametrized (sử dụng 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); 

Các implode chức năng chuỗi ? cùng với , mà không cần thêm một dấu phẩy ở cuối (source). Bạn có thể biến nó thành một hàm để làm cho nó dễ đọc hơn, nếu không thì sprintf giữ cho nó đẹp và gọn gàng mà không có chuỗi nối xấu xí.

Các vấn đề liên quan