我有一个通过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

我想搜索整个表并更改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

是否有方法搜索表并更新这些值?
输入到表中的数据量很大,因此非常希望找到一个有效的解决方案。

最佳答案

考虑使用视图而不是表,除非出于性能原因需要缓存该值。可以计算子查询中每个值的计数,并将结果连接回表,如下所示:

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

09-26 03:58