【问题标题】:Mysql set values relative to other values? [duplicate]Mysql设置值相对于其他值? [复制]
【发布时间】:2012-11-05 09:34:15
【问题描述】:

可能重复:
Create a trigger that updates a column on one table when a column in another table is updated

我有一个包含这些值的数据库表

UpVotes | DownVotes | PercentVotes
8       | 2         | 80
10      | 0         | 100
5       | 5         | 50
560     | 34        | 94

是否可以让mysql数据库像这样工作:

UpVotes | DownVotes | PercentVotes
8       | 2         | (UpVotes/(UpVotes + DownVotes)) x 100 = 80
10      | 0         | (UpVotes/(UpVotes + DownVotes)) x 100 = 100
5       | 5         | (UpVotes/(UpVotes + DownVotes)) x 100 = 50
560     | 34        | (UpVotes/(UpVotes + DownVotes)) x 100 = 94

无需通过任何脚本自动更新?就像在 excel 中一样,您可以更改 UpVotes 值或 DownVotes 值,PercentVotes 值会根据总票数自动成为新的正确百分比。

对不起,我的英语不好,但我希望你明白我的意思。 :)

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    您可以为此使用trigger。像这样的:

    delimiter |
    CREATE TRIGGER calc_percentages BEFORE INSERT on your_table
    FOR EACH ROW
    BEGIN
        SET NEW.PercentVotes = NEW.UpVotes/(NEW.UpVotes + NEW.DownVotes);
    END
    |
    delimiter ;
    

    它将在每次插入时运行并添加计算值。如果您希望它在 update 之后更新,那么只需为 after update 添加另一个触发器而不是 before insert

    由于百分比信息是一个计算值,您可以在您的选择中即时计算它,而不是将其存储在您的数据库中。但是,如果您确实需要性能提升,请使用触发器来存储它。

    【讨论】:

    • 你为什么选择BEFORE INSERT而不是AFTER UPDATE?后者不可用吗?
    • 这只是一个例子。它可以是after updateafter insert 或两者兼而有之。我在示例中选择了before insert
    • 您应该操作插入的数据而不是更新表。我认为您的示例不起作用,因为当您尝试更新数据时,数据不存在(插入之前)!您也不应该忘记拥有一个 UPDATE 触发器!
    • @Pesse:如果您认为应该有所不同,请不要尝试编辑其他人的答案。
    • 感谢您的回答,但我在尝试运行脚本时不断收到此错误:“您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本对应的手册以获取正确的语法在第 1 行的 'delimiter | CREATE TRIGGER calc_percentages AFTER UPDATE on Videos F' 附近使用“我似乎无法让它工作。有谁知道如何解决这个问题?
    【解决方案2】:

    您可能想在选择上运行类似的东西,但您可能需要检查数学。

    select UpVotes, DownVotes ((UpVotes / (UpVotes + DownVotes)) * 100) as PercentVotes from my_table;
    

    【讨论】:

      【解决方案3】:

      是的,这是可能的。 您可以使用触发器。只需在更新和插入时设置触发器,它就会改变列的值。

      【讨论】:

        【解决方案4】:

        如果您使用触发器,请尝试这样的操作

        delimiter |
        
        CREATE TRIGGER insertPercentVotes AFTER INSERT ON YourTableName
        
        // calculate percentage here
              // Execute Update query here  
         END;
        |
        

        【讨论】:

          【解决方案5】:
          delimiter //
          CREATE TRIGGER ins_votepercent BEFORE INSERT ON votetable FOR EACH ROW 
            SET NEW.PercentVotes = (NEW.UpVotes/(NEW.UpVotes+NEW.DownVotes)) * 100  
            END;//
          
          CREATE TRIGGER upd_votepercent BEFORE UPDATE ON votetable FOR EACH ROW 
            SET NEW.PercentVotes = (NEW.UpVotes/(NEW.UpVotes+NEW.DownVotes)) * 100 
            END;//
          

          MySQL Manual

          【讨论】:

            猜你喜欢
            • 2018-12-16
            • 1970-01-01
            • 2022-10-24
            • 2013-03-01
            • 2017-08-18
            • 2020-12-29
            • 2015-02-12
            • 2021-05-16
            • 2018-08-11
            相关资源
            最近更新 更多