sql >> Databáze >  >> RDS >> Mysql

opakujte mysql dotaz

To by mělo odstranit zbytečné smyčky a další dotazy, nemusí to vyřešit všechny vaše odpovědi, ale může vám to pomoci na cestě.

Tento kód jsem netestoval, takže jej nejprve spusťte v testovacím prostředí, abyste se ujistili, že jsem neudělal jednoduchou chybu, která by mohla vést ke ztrátě dat, vzhledem k povaze dotazů jsem uvedl toto vyloučení odpovědnosti, NEJPRVE TO PROSÍM VYZKOUŠEJTE TESTOVACÍMI ÚDAJI .

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

Snadný způsob testování je zakomentování mail část a změňte DELETE FROM na SELECT * FROM a ozvěte, co pochází z výběru, abyste se ujistili, že vyšla správná data, která měla být odstraněna.

ČTĚTE NÍŽE

Lepší způsob, jak provést odstranění, je použít tabulky ID a uložte jej do $delete . To by zmírnilo OR a minimalizuje chybu náhodného smazání platných řádků. Zde je návod, jak by to fungovalo (stačí použít koncovku, nahradit ID s jakýmkoliv polem ID:

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

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

AKTUALIZACE

Nejsem si jistý, jak rychle to poběží atd. Ale jeden možný způsob, jak to udělat, aniž by to bylo uvnitř smyčky, je:

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

Opět je to netestováno a nejsem si jistý, jak výkonově by to odpovídalo. Ale něco pro vás k testování.

UPRAVIT :Změněno na fetch_assoc stejně jako fetch_array



  1. Odstranit řádek se vztahy s jinými tabulkami

  2. Provádění sady SQL dotazů pomocí dávkového souboru?

  3. Počítání odkazů na záznam v tabulce pomocí cizích klíčů

  4. Mysql replikace na jednom serveru