0

そのため、毎日トップ 10 のリストを収集し、一時的なテーブルtempを作成しています。これらのリストを集約した大きなテーブルタイムラインがあり、次の列があります。

date, num, id, changed 

この 10 冊の一時的なセットが一意であるかどうか、またはソースが更新されておらず、値が繰り返されているかどうかを確認したいと思います。タイムラインに追加する前に、これを一時的に変更されたブール値でキャプチャしたいと思います。

これを行うためのより良い方法があると確信していますが、PHP 内で、前日と最後に追加されたセットの配列を作成し、現在のセットと比較して、結果を別の配列 $change_array に格納しました。これをtempに戻す方法がわかりません。つまり、この 0 と 1 の配列を列に変換するか、1 つのコマンドでそれぞれの行に値を追加します。参考までに、これらのコマンドは次のようになります。

$last_ten = "SELECT num, asin FROM timeline ORDER BY date DESC, num ASC LIMIT 0,10";
$cur_ten = "SELECT num, asin FROM temp ORDER BY num ASC";
...
for ($ind = 1; $ind <= 10; $ind++) {
    $change_array[$ind] = ($currents[$ind] == $prevs[$ind]) ? 0 : 1;
}

ご協力いただきありがとうございます!

4

1 に答える 1

0

推奨されるように array_intersect を使用して単純化することを決定し、セット全体が 1 行でも異なる場合、その日付のすべての行が異なるものとしてマークされます。

$last_ten = "SELECT num, asin FROM timeline t ORDER BY t.date DESC, t.num ASC LIMIT 0,10";
$cur_ten = "SELECT num, asin FROM $table ORDER BY num ASC";

$prevs = array(1 => "", 2 => "", 3 => "", 4 => "", 5 => "", 6 => "", 7 => "", 8 => "", 9 => "",  10 => "");
    while($r = mysql_fetch_array($last_ten_res))
    {
        $num = $r['num'];
        $prevs[$num] = $r['asin'];
    }

$currents = array(1 => "", 2 => "", 3 => "", 4 => "", 5 => "", 6 => "", 7 => "", 8 => "", 9 => "",  10 => "");
    while($r = mysql_fetch_array($cur_ten_res))
    {
        $num = $r['num'];
        $currents[$num] = $r['asin'];
    }

$different = count(array_intersect($prevs, $currents)) == 10 ? 0 : 1;
$add_change = "ALTER TABLE $table ADD changed INT(1) DEFAULT $different;";
于 2013-01-14T05:40:45.093 に答える