gpt4 book ai didi

mysql - MySQL从错误1109到错误1242

转载 作者:行者123 更新时间:2023-11-29 17:48:18 26 4
gpt4 key购买 nike

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

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

id_contingency int(11) NOT NULL AUTO_INCRMENT,
id_user int(11) 默认为空,
date_start 日期 默认为 NULL,
program_day int(11) 默认为 NULL,
date_end 日期 默认为 NULL,
总天数 int(11) 默认为 NULL,
latest_tf_id archer(255) 默认为空

我考虑将其添加为更新 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 的建议来简单地更新行,但并非所有字段都已填写,或者更新超出了之前的意外情况。

谢谢!

最佳答案

这里的 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'
;

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

关于mysql - MySQL从错误1109到错误1242,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49621711/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com