目前正在尝试找到一种在某种形式的循环中执行以下操作的方法(最好不影响数据库的性能)。
我有 3 个表 user_hours
、user_calendar
和 hours_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'
这个查询可能会像下面这样返回:
因此,对于返回的每个 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
已更新(您可能还想为 INSERT
和 DELETE
操作添加类似的触发器,具体取决于您的应用程序逻辑)。
假设 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_hours
与 user_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/