Mysql
 sql >> Baza danych >  >> RDS >> Mysql

zapętl zapytanie mysql

Powinno to usunąć niepotrzebne pętle i dodatkowe zapytania, może to nie rozwiązać wszystkich twoich odpowiedzi, ale może ci pomóc.

Nie testowałem tego kodu, więc najpierw uruchom go w środowisku testowym, aby upewnić się, że nie popełniłem prostego błędu, który może doprowadzić do utraty danych, ze względu na charakter zapytań, zamieszczam to zastrzeżenie, NAJPIERW PRZETESTUJ Z DANYMI TESTOWYMI .

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

Łatwym sposobem na przetestowanie jest skomentowanie mail część i zmień DELETE FROM do SELECT * FROM i powtórz to, co pochodzi z zaznaczenia, aby upewnić się, że pojawiły się prawidłowe dane, które powinny zostać usunięte.

PROSZĘ PRZECZYTAĆ PONIŻEJ

Jednak lepszym sposobem na usunięcie jest użycie ID tabel pole i zapisz to w $delete . Ponieważ to złagodziłoby OR oświadczenie i zminimalizować błąd przypadkowego usunięcia poprawnych wierszy. Oto jak to działa (wystarczy użyć końcówki, zastąp ID z dowolnym polem identyfikacyjnym:

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

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

AKTUALIZUJ

Nie jestem pewien, jak szybko to będzie działać itp. Ale jednym z możliwych sposobów, aby to zrobić, bez umieszczania go w pętli, jest:

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

Znowu jest to nieprzetestowane i nie jestem pewien, jak pod względem wydajności by to pasowało. Ale coś do przetestowania.

EDYTUJ :Zmieniono na fetch_assoc jak w przypadku 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. Zapobiegaj wstrzykiwaniu SQL w JavaScript / Node.js

  2. jak używać funkcji string left w hql

  3. Wybierz wiele wierszy w jednej kolumnie oddzielonych nowym wierszem

  4. Błąd składni SQL w pobliżu opisu

  5. Jak zsynchronizować bazy danych MySQL między dwiema zdalnymi bazami danych (bez techniki replikacji bazy danych MySQL)