我有一个表,我通过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
有没有办法搜索表并更新这些值? 输入表格的数据量非常大,因此非常感谢有效的解决方案。
答案 0 :(得分: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
上的索引。
答案 1 :(得分: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'] . "'";
}