【问题标题】:From error 1109 to error 1242 MySQL从错误 1109 到错误 1242 MySQL
【发布时间】:2018-04-03 03:21:43
【问题描述】:

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

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

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(未知表 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 的建议来简单地更新行,但并非所有字段都已填写,或者更新超出了以前的意外情况。

谢谢!

【问题讨论】:

    标签: mysql case mysql-error-1242


    【解决方案1】:

    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'
    ;
    

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

    【讨论】:

    • 谢谢@P.Salmon。我添加了编辑问题以添加有关该程序的用途的信息,我将试一试您的想法。
    • 谢谢@P.Salmon。当然,它可以消除错误,但它仍然无法打开和关闭意外事件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 2016-07-13
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多