代码之家  ›  专栏  ›  技术社区  ›  Andreas Bonini

mysql-每次选择行时更新视图列

  •  2
  • Andreas Bonini  · 技术社区  · 16 年前

    我有一个表有一个“视图计数”列。

    我想在每次选择行时增加所说的列(即使是使用通用的select,例如select*from table,其中1..这将使所有行的视图计数增加1)。

    有没有一种方法可以自动“服务器端”(mysql是服务器,我的应用程序是客户机),即每次都不更新?

    编辑:因为有几个人问我为什么要这样做,有几个人误解了我的要求,假设这是一个论坛软件,而表是线程表。每个线程都有一个视图计数,您希望每次在主页中显示线程时都更新它(我知道线程的视图计数通常只有在您实际查看时才更新,但这是我能想到的最好的例子,我的特定情况有点长而且复杂t)

    5 回复  |  直到 16 年前
        1
  •  6
  •   chaos    16 年前

    无法完成。你基本上想要一个 trigger SELECT 和触发器仅支持 INSERT , UPDATE DELETE . 最接近的方法是通过存储过程运行与表的所有交互,听起来您希望在所有条件下强制执行此行为。

        2
  •  1
  •   Bryan Migliorisi    16 年前

    为什么不这样发出一条SQL语句:

    UPDATE tableName SET viewCount = viewCount + 1; SELECT tableName.col1, tableName.col2;
    

    它甚至可以在任何语言中轻松地动态创建。

        3
  •  0
  •   Quassnoi    16 年前

    您可以在会话范围内执行此操作:

    SET @view_count := 0;
    
    SELECT  v.*,
            @view_count := @view_count + 1 AS view_count
    FROM    view
    

    对于查看的每一行,都有一个递增的值:

    SELECT  q.*,
            @view_count := @view_count + 1 AS view_count
    FROM    (
            SELECT  1 AS col
            UNION ALL
            SELECT  2 AS col
            ) q;
    
    -- -- 
     1  1
     2  2
    
    SELECT  q.*,
            @view_count := @view_count + 1 AS view_count
    FROM    (
            SELECT  1 AS col
            UNION ALL
            SELECT  2 AS col
            ) q;
    
    -- -- 
     1  3
     2  4
    

    但是,这只计算会话中的视图,而不计算总视图。

        4
  •  0
  •   Paul Sonier    16 年前

    我不相信有一个简单的方法来做这个服务器端;触发器只在更新、插入和删除时执行。

        5
  •  0
  •   Andrei Tanasescu    16 年前

    存储过程,但这是一种痛苦。我会在其他地方实施安全措施。