【问题标题】:Counting number of times a value occurs and sending count to another column?计算一个值出现的次数并将计数发送到另一列?
【发布时间】:2013-05-01 14:01:46
【问题描述】:

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

有没有办法在表格中搜索并更新这些值? 输入到表中的数据量非常大,因此非常感谢有效的解决方案。

【问题讨论】:

    标签: php mysql database


    【解决方案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 上的索引。

    【讨论】:

    • 嗯,一定有INSERT在某处
    • 啊,我错过了表需要更新。 (我认为你的意思是UPDATE,而不是INSERT。)
    • 非常感谢您的回答。您能否详细说明第二个示例中的 a 和 b 是什么?
    • @Ndrd 它们是表/查询别名,可以更轻松地引用特定列所在的表。在子查询的情况下,要求能够引用它的列之一,因为它没有其他名称。 (别名在将表连接到自身时特别有用,因为否则您将无法在表的两个化身之一上指示列。)
    • 那么当您检查 a.SongID 和 b.SongID 时,它们是来自不同表的列吗?为什么在您的示例中使用“a”和“b”?很抱歉这些问题,但我对 MySQL 还很陌生,对如何实现这一点有点困惑。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2019-03-27
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      • 2019-05-01
      • 2021-04-12
      相关资源
      最近更新 更多