计数值出现的次数并将计数发送到另一列?

问题描述:

我有一张表格,我通过PHP脚本将数据输入到数据库中,并使用phpMyAdmin管理它。我的桌子有4列。第一个是自动增量,第二个和第三个是输入的值,最后是为了跟踪第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 

我想通过全表搜索,并在戏剧列的值更改为显示值多少次出现在表格中。

理想的情况下,这是我多么希望我的表输出:

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 

有没有一种方式,通过该表搜索和更新这些价值观? 输入到表中的数据量非常大,因此非常感谢高效的解决方案。

考虑使用视图而不是表格,除非您需要缓存出于性能原因的值。您可以计算在子查询中的每个值的数量和结果一起回表所示:

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索引。

+0

嗯必须有一个'INSERT'某处 – fedorqui 2013-05-01 14:04:40

+0

啊,我错过了表需要更新。 (我认为你的意思是'UPDATE',而不是'INSERT'。) – cdhowie 2013-05-01 14:05:12

+0

你说得对,'UPDATE':) – fedorqui 2013-05-01 14:05:51

我想你可以使用定期运行简单的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'] . "'"; 
}