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

loop en mysql-forespørgsel

Dette burde fjerne unødvendige loops og ekstra forespørgsler, det løser måske ikke alle dine svar, men kan hjælpe dig på vej.

Jeg har ikke testet denne kode, så sørg for at køre den i et testmiljø først for at sikre, at jeg ikke lavede en simpel fejl, som kunne føre til datatab, på grund af forespørgslernes art, jeg sætter denne ansvarsfraskrivelse, TEST DET FØRST MED TESTDATA VENLIGST .

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

En nem måde at teste er at kommentere mail del og ændre DELETE FROM til SELECT * FROM og gentag, hvad der kommer fra markeringen for at sikre, at de korrekte data, der skulle have været slettet, kom ud.

LÆS VENLIGST NEDENFOR

En bedre måde at gøre sletningen på er dog at bruge tabellerne ID og gem det i $delete . Da det ville lindre OR sætning og minimer fejlen ved utilsigtet sletning af gyldige rækker. Her er hvordan det ville fungere (brugte lige slutningen, erstat ID med hvad end dit id-felt er:

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

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

OPDATERING

Jeg er ikke sikker på, hvor hurtigt dette vil køre osv. Men en mulig måde at gøre det på uden at have det inde i en løkke er:

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

Igen er dette utestet, og jeg er ikke sikker på, hvor ydelsesmæssigt det ville matche. Men noget for dig at teste.

REDIGER :Ændret til fetch_assoc i forhold til fetch_array



  1. Sådan gemmer du fremtidige(!) datoer i en database

  2. MySQL heltal usignerede aritmetiske problemer?

  3. SQL Server - indre joinforbindelse ved opdatering

  4. Hent hierarki fra en tabel som denne