Mysql
 sql >> Base de données >  >> RDS >> Mysql

boucler une requête mysql

Cela devrait supprimer les boucles inutiles et les requêtes supplémentaires, cela peut ne pas résoudre toutes vos réponses, mais peut vous aider en cours de route.

Je n'ai pas testé ce code, alors assurez-vous de l'exécuter d'abord dans un environnement de test pour vous assurer que je n'ai pas fait une simple erreur qui pourrait entraîner une perte de données, en raison de la nature des requêtes, j'ai mis cet avertissement, TESTEZ-LE D'ABORD AVEC DES DONNÉES DE TEST S'IL VOUS PLAÎT .

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

Un moyen simple de tester est de commenter le mail partie et modifiez le DELETE FROM à SELECT * FROM et faites écho à ce qui vient de la sélection pour vous assurer que les données appropriées qui auraient dû être supprimées sont sorties.

VEUILLEZ LIRE CI-DESSOUS

Une meilleure façon de faire la suppression, cependant, est d'utiliser les tables ID champ et stockez-le dans le $delete . Comme cela atténuerait le OR déclaration et minimiser l'erreur de suppression accidentelle de lignes valides. Voici comment cela fonctionnerait (juste utilisé la fin, remplacez ID quel que soit votre champ d'identification :

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

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

MISE À JOUR

Je ne sais pas à quelle vitesse cela fonctionnera, etc. Mais une façon possible de le faire, sans l'avoir à l'intérieur d'une boucle est :

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

Encore une fois, cela n'a pas été testé et je ne sais pas à quel point cela correspondrait en termes de performances. Mais quelque chose à tester.

MODIFIER  :Changé en fetch_assoc par opposition à fetch_array