Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

lặp một truy vấn mysql

Thao tác này sẽ loại bỏ các vòng lặp không cần thiết và các truy vấn bổ sung, điều này có thể không giải quyết được tất cả các câu trả lời của bạn, nhưng có thể giúp ích cho bạn trong suốt quá trình.

Tôi chưa thử nghiệm mã này, vì vậy hãy đảm bảo chạy nó trong môi trường thử nghiệm trước để đảm bảo rằng tôi không mắc một lỗi đơn giản có thể dẫn đến mất dữ liệu, do bản chất của các truy vấn, tôi đưa ra tuyên bố từ chối trách nhiệm này, KIỂM TRA ĐẦU TIÊN VỚI DỮ LIỆU THỬ NGHIỆM VUI LÒNG .

    $rest_max = '200';

    $query = "SELECT * 
        FROM `mailer_lists` ml  
            JOIN `mailer_controller` mc ON ml.project_name = mc.project_name
        WHERE `email` LIKE '%".$throttle_domain."' LIMIT ".$trim_speed."" ;

    $result = mysql_query($query) or die(mysql_error());
    $delete=array();

    while($row = mysql_fetch_assoc($result)){
        $email = $row['email'];
        $project_name = $rowa['project_name'];
        $from_name = $rowa['from_name'];
        $from_email = $rowa['from_name']."@".$node_domain;
        $subject = $rowa['subject'];
        $body = $rowa['body'];
        $content = addslashes($body);

    // set header
    $header_from = 'From: '.$from_name.' <'.$from_email.'>';
    $header_reply_to = '-f  '.$from_email;

    // send mail
    mail($email,$subject,$body,$header_from,$header_reply_to);


    $delete[] = " (project_name = '$project_name' AND email = '$email') ";
}

if (!empty($delete)) {
    mysql_query("DELETE FROM mailer_lists 
        WHERE " . implode(' OR ', $delete)) or die(mysql_error());  
}

Một cách dễ dàng để kiểm tra là nhận xét mail và thay đổi DELETE FROM thành SELECT * FROM và lặp lại những gì xuất phát từ vùng chọn để đảm bảo dữ liệu thích hợp đáng lẽ đã bị xóa xuất hiện.

VUI LÒNG ĐỌC BÊN DƯỚI

Tuy nhiên, cách tốt hơn để xóa là sử dụng ID của Bảng và lưu trữ trường đó trong $delete . Như vậy sẽ làm giảm bớt OR và giảm thiểu lỗi vô tình xóa các hàng hợp lệ. Đây là cách nó sẽ hoạt động (chỉ cần sử dụng phần cuối, thay thế ID với bất kỳ trường id nào của bạn là:

    $delete[] = $row['id'];
}

if (!empty($delete)) {
    mysql_query("DELETE FROM mailer_lists 
        WHERE id IN(" . implode(', ', $delete) . ")") or die(mysql_error());  
}

CẬP NHẬT

Tôi không chắc điều này sẽ chạy nhanh như thế nào, v.v. Nhưng có một cách khả thi để làm điều đó mà không cần có nó bên trong vòng lặp là:

    // Fill the array however you want to with the domains. this is just an example
    $throttle = array('domain1.com', 'domain2.com', 'domain3.com');
    $query = "SELECT * 
        FROM `mailer_lists` ml  
            JOIN `mailer_controller` mc ON ml.project_name = mc.project_name
        WHERE `email` LIKE '%". implode("' OR `email` LIKE '%", $throttle) . "'  LIMIT ".$trim_speed." ORDER BY project_name, email";

Một lần nữa, điều này vẫn chưa được kiểm tra và tôi không chắc nó sẽ phù hợp với hiệu suất như thế nào. Nhưng một cái gì đó để bạn kiểm tra.

CHỈNH SỬA :Đã thay đổi thành fetch_assoc như được thêm vào fetch_array



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sử dụng api biểu đồ google dòng thời gian với php - Khởi tạo DataTable

  2. In một hàng ngẫu nhiên từ truy vấn mysql

  3. Truy vấn SQL trả về một bảng trong đó mỗi hàng đại diện cho một ngày trong một phạm vi nhất định

  4. Hai bảng, tùy theo mối quan hệ từ một đến nhiều. Làm thế nào để nối các giá trị mà không có các hàng trùng lặp?

  5. Cách quản lý các đặc quyền với các vai trò trong MySQL