1

PHPスクリプトを介してデータをフィードしたテーブルがあり、phpMyAdminを使用して管理しています。私のテーブルには4つの列があります。1 つ目は自動インクリメント、2 つ目と 3 つ目は入力される値、最後は列 3 の値が何回出現したかを追跡するためのものです。

これは私のテーブルが現在どのように表示されているかです

RowNumber   UserID  SongID  Plays
1             540   2191    0
2             540   2671    0
3             550   3891    0
4             550   2191    0
5             550   2671    0
6             560   9391    0
7             560   2191    0

テーブル全体を検索し、Plays 列の値を変更して、その値がテーブルに表示される回数を表示したいと考えています。

理想的には、これが私のテーブルの出力方法です。

RowNumber   UserID  SongID  Plays
1             540   2191    3
2             540   2671    2
3             550   3891    1
4             550   2191    3
5             550   2671    2
6             560   9391    1
7             560   2191    3

テーブルを検索してこれらの値を更新する方法はありますか? テーブルに入力されるデータの量は非常に大きいため、効率的なソリューションがあれば大歓迎です。

4

2 に答える 2

1

パフォーマンス上の理由で値をキャッシュする必要がない限り、テーブルの代わりにビューを使用することを検討してください。次のように、サブクエリの各値のカウントを計算し、結果をテーブルに結合できます。

SELECT Table.RowNumber, Table.UserID, Table.SongID, x.Plays
FROM Table
INNER JOIN (
    SELECT SongID, COUNT(*) AS Plays
    FROM Table
    GROUP BY SongID
) x
ON Table.SongID = x.SongID;

を使用して、そこからビューを作成しますCREATE VIEW TableWithPlays AS SELECT ...。インデックスをオンにすると、サブクエリをかなり迅速に完了できるようになり、列が最新であることSongIDを心配する必要がなくなります。Plays

実際に値をキャッシュしたい場合はUPDATE、上記のクエリに基づくクエリを使用します。

UPDATE Table a
INNER JOIN (
    SELECT SongID, COUNT(*) AS Plays
    FROM Table
    GROUP BY SongID
) b
ON a.SongID = b.SongID
SET Plays = b.Plays;

ビュー ソリューションと同様に、 のインデックスを忘れないでくださいSongID

于 2013-05-01T14:04:01.887 に答える
0

定期的に実行される単純な PHP クエリを使用できると思います (注: 実際のコードではありません)。

$sql = "SELECT UserID, SongID, COUNT(RowNumber) AS CNT FROM SomeTable GROUP BY 1, 2 ORDER BY 3 ASC";

foreach($result as $row){
   $sql = "UPDATE SomeTable SET Plays = ".$row['CNT']." WHERE UserID = '" . $row['UserID'] . "' AND SongID = '" . $row['SongID'] . "'";
}
于 2013-05-01T14:10:54.280 に答える