Mysql
 sql >> Database >  >> RDS >> Mysql

eseguire il loop di una query MySQL

Questo dovrebbe rimuovere i loop non necessari e le query extra, questo potrebbe non risolvere tutte le tue risposte, ma potrebbe aiutarti lungo la strada.

Non ho testato questo codice, quindi assicurati di eseguirlo prima in un ambiente di test per assicurarti di non aver commesso un semplice errore che potrebbe portare alla perdita di dati, a causa della natura delle query, ho inserito questo disclaimer, PROVA PRIMA CON I DATI DI PROVA PER FAVORE .

    $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 modo semplice per testare è commentare la mail parte e cambia il DELETE FROM a SELECT * FROM e fai eco a ciò che viene dalla selezione per assicurarti che i dati corretti che avrebbero dovuto essere eliminati siano usciti.

LEGGERE QUI SOTTO

Un modo migliore per eliminare, tuttavia, è utilizzare il ID delle tabelle campo e salvalo nel $delete . Poiché ciò allevierebbe il OR istruzione e ridurre al minimo l'errore di eliminazione accidentale di righe valide. Ecco come funzionerebbe (usa solo il finale, sostituisci ID con qualunque sia il tuo campo ID:

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

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

AGGIORNAMENTO

Non sono sicuro di quanto velocemente funzionerà, ecc. Ma un possibile modo per farlo, senza averlo all'interno di un ciclo è:

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

Anche in questo caso non è stato testato e non sono sicuro di quanto potrebbe corrispondere in termini di prestazioni. Ma qualcosa per te da testare.

MODIFICA :Modificato in fetch_assoc rispetto a fetch_array