0

我正在使用一个程序从我们系统中的程序计算用户“中断”(又名意外事件)的长度。它在一个程序之后运行,该程序根据用户是否完成日常治疗以及程度来确定用户状态。

此过程的目的是通过向具有以下模式的表中添加一行来记录用户意外事件的长度:

id_contingency int(11) NOT NULL AUTO_INCREMENT, id_user int(11) DEFAULT NULL, date_start date DEFAULT NULL, program_day int(11) DEFAULT NULL, date_end date DEFAULT NULL, total_days int(11) DEFAULT NULL, latest_tf_id archer(255) DEFAULT NULL

我考虑将其添加为更新 user_status 表的触发器,但我不能冒险阻止该表更新。因此,此过程首先关闭先前打开的意外事件,当用户第一次进入中断但现在已恢复程序时,它稍后会为现在第一次在治疗中开始中断的用户打开新的意外事件。然后它保持打开状态,直到他们恢复程序,并计算他们中断了多长时间。

这是我的原始程序,它返回错误 1109 (unknown table tbl_user_status) :

DELIMITER $$
CREATE DEFINER=CURRENT_USER PROCEDURE `proc_cont_calc`
NO SQL 
BEGIN

#CLOSE OPEN CONTINGENCIES FIRST  or d0 > d1
CASE 
    WHEN tbl_user_status.d4 = 1 AND tbl_user_status.d2 > 0 AND tbl_user_status.user_status = 'seguimiento' THEN 
        UPDATE tbl_user_contingency, tbl_user_status SET 
        tbl_user_contingency.date_end = CURRENT_DATE,
        tbl_user_contingency.total_days = DATEDIFF(tbl_user_contingency.date_start, tbl_user_contingency.date_end),
        tbl_user_contingency.updated_by = 'proc_cont.close'
        WHERE tbl_user_contingency.date_end = '' AND tbl_user_contingency.id_smoker = tbl_user_status.id_smoker LIMIT 1;
#OPEN NEW CONTINGENCIES
    WHEN tbl_user_status.d5 = 1 AND tbl_user_status.d4 = 0 AND tbl_user_status.user_status = 'contingencia' THEN
        INSERT INTO tbl_user_contingency (id_smoker, roadmap_day, date_start, latest_tf_id, updated_by) SELECT 
        id_smoker, roadmap_day, CURRENT_DATE, latest_tf_id, 'proc_cont.open' FROM tbl_user_status;
END CASE;
END$$ 
DELIMITER;

所以我尝试了这个(除其他外):

CASE 
    WHEN (SELECT d4 FROM tbl_user_status) = 1 AND (SELECT d2 FROM tbl_user_status) > 0 AND (SELECT user_status FROM tbl_user_status) = 'seguimiento' THEN 
        UPDATE tbl_user_contingency, tbl_user_status SET 
        tbl_user_contingency.date_end = CURRENT_DATE,
        tbl_user_contingency.total_days = DATEDIFF(tbl_user_contingency.date_start, tbl_user_contingency.date_end),
        tbl_user_contingency.updated_by = 'proc_cont.close'
        WHERE tbl_user_contingency.id_smoker = tbl_user_status.id_smoker LIMIT 1;
#OPEN NEW CONTINGENCIES
    WHEN (SELECT d5 FROM tbl_user_status) = 1 AND (SELECT d4 FROM tbl_user_status) = 0 AND (SELECT user_status FROM tbl_user_status) = 'contingencia' THEN
        INSERT INTO tbl_user_contingency (id_smoker, roadmap_day, date_start, latest_tf_id, updated_by) SELECT 
        id_smoker, roadmap_day, CURRENT_DATE, latest_tf_id, 'proc_cont.open' FROM tbl_user_status;
END CASE;

现在我收到返回多行的错误 1242。

我怎样才能让这个程序正常运行?谢谢!

更新 - 我尝试了@P.Salmon 的建议来简单地更新行,但并非所有字段都被填写,或者更新超出了以前的意外情况。

谢谢!

4

1 回答 1

0

case 语句在这里似乎没有必要,只需将条件移至 where 子句即可

UPDATE tbl_user_contingency join tbl_user_status on tbl_user_contingency.id_smoker = tbl_user_status.id_smoker 
    SET 
        tbl_user_contingency.date_end = CURRENT_DATE,
        tbl_user_contingency.total_days = DATEDIFF(tbl_user_contingency.date_start, tbl_user_contingency.date_end),
        tbl_user_contingency.updated_by = 'proc_cont.close'
WHERE tbl_user_contingency.date_end = '' AND
           tbl_user_status.d4 = 1 AND tbl_user_status.d2 > 0 AND tbl_user_status.user_status = 'seguimiento'
;

INSERT INTO tbl_user_contingency (id_smoker, roadmap_day, date_start, latest_tf_id, updated_by) 
SELECT 
        id_smoker, roadmap_day, CURRENT_DATE, latest_tf_id, 'proc_cont.open' 
FROM tbl_user_status
where tbl_user_status.d5 = 1 AND tbl_user_status.d4 = 0 AND tbl_user_status.user_status = 'contingencia'
;

如果您描述您正在尝试做什么而不是让我们通过逆向工程两个非工作代码段来猜测,您可以改进您的问题并因此获得更好的响应,方法是将您的表定义、示例数据和预期输出作为文本添加到你的问题。顺便说一句,我希望你有一种机制可以阻止这件事不止一次地做事。

于 2018-04-03T08:08:43.130 回答