我正在使用一个过程从我们系统中的程序中计算用户“中断”(也称为偶发事件)的长度。它在一个过程之后运行,该过程根据用户是否正在完成日常治疗以及在多大程度上确定用户状态。
此过程的目的是通过向具有以下架构的表中添加一行来记录用户意外事件的长度:
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的建议,简单地更新行,但并不是所有的字段都在填写,或者更新超出了之前的意外情况。
谢谢!
发布于 2018-04-03 16:08:43
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'
;通过将表定义、样本数据和预期输出作为文本添加到您的问题中,如果您描述您正在尝试做什么,而不是通过反向工程两个非工作代码段,您可以改进您的问题,从而获得更好的响应。顺便说一句,我希望你有一个机制,可以阻止这个东西不止一次地做事情。
https://stackoverflow.com/questions/49621711
复制相似问题