Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

loop kueri mysql

Ini akan menghapus loop yang tidak perlu dan pertanyaan tambahan, ini mungkin tidak menyelesaikan semua jawaban Anda, tetapi dapat membantu Anda di sepanjang jalan.

Saya belum menguji kode ini, jadi pastikan untuk menjalankannya di lingkungan pengujian terlebih dahulu untuk memastikan bahwa saya tidak membuat kesalahan sederhana yang dapat menyebabkan hilangnya data, karena sifat kueri, saya memberikan penafian ini, TEST DULU DENGAN DATA TEST HARAP .

    $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());  
}

Cara mudah untuk menguji adalah mengomentari mail bagian dan ubah DELETE FROM ke SELECT * FROM dan gema apa yang berasal dari pilih untuk memastikan data yang tepat yang seharusnya dihapus keluar.

HARAP BACA DI BAWAH

Namun, cara yang lebih baik untuk menghapus adalah dengan menggunakan ID Tabel bidang dan simpan itu di $delete . Karena itu akan meringankan OR pernyataan dan meminimalkan kesalahan karena tidak sengaja menghapus baris yang valid. Begini cara kerjanya (cukup gunakan akhiran, ganti ID dengan apa pun bidang id Anda:

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

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

PERBARUI

Saya tidak yakin seberapa cepat ini akan berjalan, dll. Tetapi satu cara yang mungkin untuk melakukannya, tanpa memasukkannya ke dalam loop adalah:

    // 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";

Sekali lagi ini belum teruji, dan saya tidak yakin bagaimana kinerjanya akan cocok. Tapi sesuatu untuk Anda uji.

EDIT :Diubah menjadi fetch_assoc seperti yang berlawanan dengan 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. com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:Kegagalan tautan komunikasi

  2. mendapatkan kesalahan - SQLSTATE[21000]:Pelanggaran kardinalitas:1241 Operand harus berisi 1 kolom

  3. Cara mengoptimalkan kueri MySQL yang sangat lambat yang menemukan korelasi

  4. Bagaimana menghubungkan Android dengan MySQL menggunakan driver Mysql JDBC

  5. Kinerja beberapa sisipan MySQL