2

トランザクション テーブルからポイントの合計を選択する cron ジョブを作成しようとしています。

ポイントの合計と従業員 ID に基づいて、合計ポイント テーブルを更新する必要があります。最善の方法を使用していること、およびこれが機能することを確認したいと思います。

 <?php

    $conn = mysql_connect("localhost", "mysql_user", "mysql_password");

    if (!$conn) {
        echo "Unable to connect to DB: " . mysql_error();
        exit;
    }

    if (!mysql_select_db("mydbname")) {
        echo "Unable to select mydbname: " . mysql_error();
        exit;
    }

    $sql = "SELECT ID, SUM(POINTS) as Points, FROM Transactions WHERE Status = 1 Group By ID";

    $result = mysql_query($sql);

    if (!$result) {
        echo "Could not successfully run query ($sql) from DB: " . mysql_error();
        exit;
    }

    if (mysql_num_rows($result) == 0) {
        echo "No rows found, nothing to print so am exiting";
        exit;
    }


    while ($row = mysql_fetch_assoc($result)) {  

    mysql_query("UPDATE Totals SET Points=" + $row["Points"] + "WHERE ID=" +  $row["id"]);

    }


    mysql_free_result($result);

    ?> 
4

2 に答える 2

3

ステートメントで引き続きテーブル (およびサブクエリ) を結合できます。UPDATEこれを試して、

UPDATE Totals a 
        INNER JOIN
        (
            SELECT ID, SUM(POINTS) as Points, 
            FROM Transactions 
            WHERE Status = 1 
            Group By ID
        ) b
        ON a.ID = b.ID
SET a.Points = b.Points

お役に立てれば。

PDO 拡張機能の使用例(コード スニペット)

<?php

$query = "UPDATE Totals a 
            INNER JOIN
            (
                SELECT ID, SUM(POINTS) as Points, 
                FROM Transactions 
                WHERE Status = ? 
                Group By ID
            ) b
            ON a.ID = b.ID
    SET a.Points = b.Points";

$iStatus = 1;
$stmt = $dbh->prepare($query);
$stmt->bindParam(1, $iStatus);

$stmt->execute();

?>

PDO マニュアル
PDO PreparedStatement

于 2012-08-27T15:11:17.633 に答える
0

cron ジョブを介してスクリプトを実行する前に、スクリプトをテストできないのはなぜですか? 構文に問題があることはわかりません。繰り返しになりますが、ざっと見ただけで、テーブル構造がどのようなものかわかりません。

最善の方法を探している場合は、mysql 関数の代わりに mysqli または PDO の使用を検討する必要があります。そうすれば、ループ内で複数のクエリを実行することを計画している場合、DBMS にそれほど負担をかけない準備済みステートメントを利用できます。プリペアド ステートメントでは、サーバーへの個別のラウンド トリップを行う必要はありませんが、古い mysql 関数では必要です。

于 2012-08-27T15:14:23.687 に答える