php - MySQL 从选择中更新并进一步选择和更新

标签 php mysql stored-procedures event-triggers

目前正在尝试找到一种在某种形式的循环中执行以下操作的方法(最好不影响数据库的性能)。

我有 3 个表 user_hoursuser_calendarhours_statistics。我需要先做:

SELECT user_calendar.date_start,
       user_calendar.opportunity_id,
       user_hours.user_id,
       user_hours.agreed_hours,
       user_hours.completed_hours,
       user_hours.hours_committed
FROM   user_calendar
       JOIN user_hours
         ON user_calendar.user_calendar_id = user_hours.user_calendar_id
WHERE  user_calendar.date_start = CURRENT_DATE()
       AND user_hours.completed_hours IS NULL
       AND user_hours.hours_committed = 'accepted'

这个查询可能会像下面这样返回:

http://i.imgur.com/5cJ5v.png

因此,对于返回的每个 opportunity_id 和 user_id,我想执行以下操作:

UPDATE user_hours
SET    completed_hours = agreed_hours,
       hours_committed = 'completed'
WHERE  opportunity_id = {opportunity_id}
       AND user_id = {user_id}
       AND hours_committed = 'accepted'
       AND completed_hours IS NULL

请注意,此时需要循环 {opportunity_id} 和 {user_id}(见屏幕截图),因为我们需要在每个机会上遍历每个用户。

然后对于每条更新的记录,我需要获取总小时数,例如:

// Get hours they have done to send to statistics data table
SELECT sum(completed_hours) FROM user_hours WHERE user_id = {user_id} AND opportunity_id = {opportunity_id} 

// Get the completed hours total somehow as a variable
$completed_hours = (from result above)

// Commit stats
UPDATE hours_statistics SET completed_hours = (completed_hours+$completed_hours)
WHERE user_id = {user_id} AND opportunity_id =  {opportunity_id} 

任何人都可以帮助将其编写为某种过程或触发器,或者帮助我朝着正确的方向前进以获得循环这些东西的起点吗?手动查询工作,只需要循环/自动运行统计更新。

最佳答案

您可以创建触发器来更新 hours_statistics每当user_hours已更新(您可能还想为 INSERTDELETE 操作添加类似的触发器,具体取决于您的应用程序逻辑)。

假设 UNIQUE key 已在 hours_statistics.(user_id, opportunity_id) 上定义可以使用 INSERT ... ON DUPLICATE KEY UPDATE 在触发器内:

CREATE TRIGGER foo AFTER UPDATE ON user_hours FOR EACH ROW
  INSERT INTO hours_statistics (user_id, opportunity_id, completed_hours) VALUES
    (OLD.user_id, OLD.opportunity_id, -OLD.completed_hours),
    (NEW.user_id, NEW.opportunity_id, +NEW.completed_hours)
  ON DUPLICATE KEY UPDATE
    completed_hours = completed_hours + VALUES(completed_hours);

然后你可以使用单个UPDATE语句(使用多表语法将 user_hoursuser_calendar 连接起来)以对 user_hours 执行所有更新一次性,这将导致上述触发器更新 hours_statistics根据需要:

UPDATE user_hours JOIN user_calendar USING (user_calendar_id, opportunity_id)
SET    user_hours.completed_hours = agreed_hours,
       user_hours.hours_committed = 'completed'
WHERE  user_hours.hours_committed = 'accepted' 
   AND user_hours.completed_hours IS NULL
   AND user_calendar.date_start = CURRENT_DATE();

关于php - MySQL 从选择中更新并进一步选择和更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12129363/

相关文章:

php - 错还是对?循环

php - 如何让 PHP 脚本在浏览器中运行?

php - 将两张表中的相似数据合并到一张表中

c# - 重复调用oracle存储过程

C# SQL 存储过程(插入) - 传递参数和检索参数

php - PHP中的依赖倒置原则

php - 如何使用 php html 中的 href 标签将 php 中的值发布到另一页面

javascript - 在 jQuery datepicker 中分配从 mysql 获取的日期

mysql - 强制 MySQL 在另一个条件之前评估一个条件

sql - 在 where 子句中切换大小写/If