Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Schleife eine MySQL-Abfrage

Dies sollte unnötige Schleifen und zusätzliche Abfragen entfernen, dies löst möglicherweise nicht alle Ihre Antworten, kann Ihnen aber auf dem Weg helfen.

Ich habe diesen Code nicht getestet, also stellen Sie sicher, dass Sie ihn zuerst in einer Testumgebung ausführen, um sicherzustellen, dass ich keinen einfachen Fehler gemacht habe, der zu Datenverlust führen könnte. Aufgrund der Art der Abfragen habe ich diesen Haftungsausschluss BITTE ZUERST MIT TESTDATEN TESTEN .

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

Eine einfache Möglichkeit zum Testen ist das Auskommentieren der mail Teil und ändern Sie den DELETE FROM zu SELECT * FROM und wiederholen Sie, was von der Auswahl kommt, um sicherzustellen, dass die richtigen Daten, die gelöscht werden sollten, herauskamen.

BITTE UNTEN LESEN

Eine bessere Methode zum Löschen ist jedoch die Verwendung der ID der Tabelle Feld und speichern Sie das in $delete . Denn das würde das OR erleichtern -Anweisung und minimieren Sie den Fehler, versehentlich gültige Zeilen zu löschen. So würde das funktionieren (nur die Endung verwendet, ID ersetzen mit was auch immer Ihr ID-Feld ist:

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

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

AKTUALISIEREN

Ich bin mir nicht sicher, wie schnell das laufen wird usw. Aber ein möglicher Weg, es zu tun, ohne es in einer Schleife zu haben, ist:

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

Auch dies ist ungetestet, und ich bin mir nicht sicher, wie leistungsmäßig es zusammenpassen würde. Aber etwas zum Testen.

BEARBEITEN :Geändert in fetch_assoc im Gegensatz zu fetch_array