【发布时间】:2018-07-15 05:00:11
【问题描述】:
我是 MySQL 新手。
我正在开发一个系统,其中许多用户被分配到特定任务。当他们在一段时间内不活动时(比如说超过 10 分钟),我希望系统自动清除他们的任务,以便其他人可以处理它们。
为了实现这一点,我创建了一个名为 tblactivitytracker 的表来进行活动跟踪。分配位于名为 tblinquiries 的表中。我创建了一个存储过程来获取非活动用户。
这是一个 sqlfiddle 示例:Get Inactive Users
在上面的示例中,我得到了 3 个非活动用户:auditor1、auditor2 和 audit3。
我创建了一个存储过程来清除单个用户的分配,它完美地完成了这项工作。
CREATE PROCEDURE `spClearAssignedInquiry`(IN `pAssignedTo` VARCHAR(50))
UPDATE
tblinquiries
SET
AuditStatus='Check', AssignedTo=NULL, Result=NULL,
ResultCategories=NULL, AuditBy=NULL,
Remarks=NULL, StartTime=NULL, EndTime=NULL
WHERE
AssignedTo=pAssignedTo AND
AuditStatus='Assigned' AND EndTime IS NULL
如果我在上述过程中将 audit1 作为参数传递,它将清除用户的分配。
为了一次性通过所有非活动用户并清除分配,我在this stackoverflow solution 之后尝试了以下过程:
CREATE PROCEDURE `spInactiveUsers`()
BEGIN
DECLARE done BOOLEAN DEFAULT FALSE;
DECLARE AssignedTo VARCHAR(50);
DECLARE cur CURSOR FOR
SELECT
q1.AssignedTo AS AssignedTo
FROM
(SELECT
InquiryId, AssignedTo
FROM
tblinquiries
WHERE
AuditStatus='Assigned' AND StartTime IS NOT NULL AND EndTime IS NULL
ORDER BY
AssignedTo ASC
) q1
RIGHT JOIN
(SELECT
UserId, MAX(LastActivity) AS LastActivity, ROUND(TIME_TO_SEC(TIMEDIFF(MAX(LastActivity),CURRENT_TIMESTAMP()))/60,0) AS InactiveMinutes
FROM
tblactivitytracker
GROUP BY
UserId
ORDER BY
LastActivity ASC
) q2
ON
q2.UserId=q1.AssignedTo
WHERE
q2.InactiveMinutes>10;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done := TRUE;
OPEN cur;
testLoop: LOOP
FETCH cur INTO AssignedTo;
IF done THEN
LEAVE testLoop;
END IF;
CALL spClearAssignedInquiry(AssignedTo);
END LOOP testLoop;
CLOSE cur;
END
但它并没有清除任何分配。
在过去的几天里,我一直在用头撞墙。任何帮助将非常感激。提前致谢。
【问题讨论】:
-
单独运行查询没有任何问题。这是小提琴中的数据:sqlfiddle.com/#!9/a6e573/2