sql >> Base de Datos >  >> RDS >> Mysql

bucle de una consulta mysql

Esto debería eliminar bucles innecesarios y consultas adicionales; es posible que no resuelva todas sus respuestas, pero puede ayudarlo en el camino.

No he probado este código, así que asegúrese de ejecutarlo primero en un entorno de prueba para asegurarse de que no cometí un simple error que podría conducir a la pérdida de datos, debido a la naturaleza de las consultas, pongo este descargo de responsabilidad, PROBARLO PRIMERO CON DATOS DE PRUEBA .

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

Una manera fácil de probar es comentar el mail parte y cambie el DELETE FROM a SELECT * FROM y repita lo que proviene de la selección para asegurarse de que salieron los datos correctos que deberían haberse eliminado.

POR FAVOR LEA ABAJO

Sin embargo, una mejor manera de hacer la eliminación es usar las tablas ID campo y guárdelo en el $delete . Como eso aliviaría el OR declaración y minimizar el error de eliminar filas válidas por accidente. Así es como funcionaría (simplemente use el final, reemplace ID con cualquiera que sea su campo de identificación:

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

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

ACTUALIZAR

No estoy seguro de qué tan rápido se ejecutará, etc. Pero una forma posible de hacerlo, sin tenerlo dentro de un bucle, es:

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

Una vez más, esto no se ha probado, y no estoy seguro de cómo coincidiría en cuanto a rendimiento. Pero algo para que pruebes.

EDITAR :Cambiado a fetch_assoc como opuesto a fetch_array