0

古い MySQL PHP メソッド呼び出しを更新しようとしていますが、同じ結果を得るために同じ SELECT 呼び出しを 2 回呼び出すことになります。これを行うより良い方法はありますか?

ここにオリジナルがあります:

function updateProbabilities()
{
    // first update the word count of each category
    $rs = $this->con->select("SELECT category_id, SUM(count) AS total FROM nb_wordfreqs WHERE 1 GROUP BY category_id");
    $total_words = 0;
    while (!$rs->EOF()) {
        $total_words += $rs->f('total');
        $rs->moveNext();
    }
    $rs->moveStart();
    if ($total_words == 0) {
        $this->con->execute("UPDATE nb_categories SET word_count=0, probability=0 WHERE 1");
        return true;
    }
    while (!$rs->EOF()) {
        $proba = $rs->f('total')/$total_words;
        $this->con->execute("UPDATE nb_categories SET word_count=".(int)$rs->f('total').",
                                    probability=".$proba."
                                    WHERE category_id = '".$rs->f('category_id')."'");
        $rs->moveNext();
    }
    return true;
}

これが私のバージョンです:

function updateProbabilities() {

    $sql = "SELECT category_id, SUM(count) AS total FROM nb_wordfreqs WHERE 1 GROUP BY category_id";
    $res = mysql_query($sql) or die (mysql_error());

    $total_words = 0;

    while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) {
        $total_words += $row['total'];
    }

    if ($total_words >= 1) {

        $sql = "SELECT category_id, SUM(count) AS total FROM nb_wordfreqs WHERE 1 GROUP BY category_id";
        $res = mysql_query($sql) or die (mysql_error());

        while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) {

            $proba = $row['total']/$total_words;

            $count = (int)$row['total'];

            $sql = "UPDATE nb_categories SET word_count=".$count.",
                    probability=".$proba."
                    WHERE category_id = '".$row['category_id']."'";

            mysql_query($sql) or die (mysql_error());
        }

    }
    else {

        $sql = "UPDATE nb_categories SET word_count=0, probability=0 WHERE 1";
        mysql_query($sql) or die (mysql_error());
    }

    return true;
}

この 2 回目の重複した SELECT 呼び出しを回避する方法はありますか?

4

3 に答える 3

1

mysql に相当するもの$rs->moveStart()は次のとおりです。

mysql_data_seek($res, 0);

PS 新しい API に書き直すのであれば、なぜ非推奨の mysql 拡張機能を使用しているのですか? mysqli または PDO を使用する必要がありますか? カーソルを巻き戻すための同様の方法があります。

于 2013-02-22T17:15:27.173 に答える
1

クエリを初めて実行するときは、これを while ループに追加して結果を保存します。

$rowarray[] = $row; // added to prevent running it twice

次に、2回目に表示されたら、これを置き換えます:

$sql = "SELECT category_id, SUM(count) AS total FROM nb_wordfreqs WHERE 1 GROUP BY category_id";
$res = mysql_query($sql) or die (mysql_error());
while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) {

これとともに:

foreach ($rowarray as $row) {

また、mysql_ 関数は非推奨であり、間もなく PHP から削除されるため、これらの関数から離れてください。PDO または MySQLi に変更します。あなたはすでにコードを更新していますが、その変更も行うかもしれません。

于 2013-02-22T17:12:02.880 に答える
-1

最初のクエリを一意の変数に設定し、そのクエリの結果を再利用できます。

function updateProbabilities() {

$sql = "SELECT category_id, SUM(count) AS total FROM nb_wordfreqs WHERE 1 GROUP BY category_id";
$res = mysql_query($sql) or die (mysql_error());

$total_words = 0;
$results = array();

while ($row1 = mysql_fetch_array($res, MYSQL_ASSOC)) {
    $total_words += $row1['total'];
    $results[] = $row1;
}

if ($total_words >= 1) {

    foreach ($results as $row2) {

        $proba = $row2['total']/$total_words;

        $count = (int)$row2['total'];

        $sql = "UPDATE nb_categories SET word_count=".$count.",
                probability=".$proba."
                WHERE category_id = '".$row2['category_id']."'";

        mysql_query($sql) or die (mysql_error());
    }

}
else {

    $sql = "UPDATE nb_categories SET word_count=0, probability=0 WHERE 1";
    mysql_query($sql) or die (mysql_error());
}

return true;

}

于 2013-02-22T17:16:14.817 に答える