sql >> データベース >  >> RDS >> Mysql

mysqlクエリをループする

    これにより、不要なループや余分なクエリが削除されます。これにより、すべての回答が解決されるとは限りませんが、途中で役立つ場合があります。

    私はこのコードをテストしていないので、最初にテスト環境で実行して、クエリの性質上、データの損失につながる可能性のある単純な間違いを犯していないことを確認してください。この免責事項を記載します。最初にテストデータを使用してテストしてください

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

    テストする簡単な方法は、mailをコメントアウトすることです。 DELETE FROMを分割して変更します SELECT * FROMへ 選択から得られたものをエコーアウトして、削除されるべき適切なデータが出ていることを確認します。

    以下をお読みください

    ただし、削除を行うためのより良い方法は、テーブルのIDを使用することです。 フィールドに入力し、それを$deleteに保存します 。それはORを軽減するので ステートメントを作成し、有効な行を誤って削除するエラーを最小限に抑えます。これがどのように機能するかを示します(エンディングを使用し、IDを置き換えます IDフィールドが何であれ:

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

    更新

    これがどれだけ速く実行されるかなどはわかりません。しかし、ループ内に配置せずに実行する方法の1つは、次のとおりです。

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

    繰り返しになりますが、これはテストされておらず、パフォーマンスの面でどのように一致するかはわかりません。しかし、あなたがテストするための何か。

    編集fetch_assocに変更されました fetch_arrayの代わりに



    1. 2つのテーブルを持つMysqlクエリphp

    2. Oracleデータベースとは何ですか?

    3. 例外の取得ORA-00942:表またはビューが存在しません-既存の表に挿入する場合

    4. 一般的なMySQLエラー:「通信パケットの読み取り中にエラーが発生しました」