我创建了这个 MySQL 存储过程作为我的问题的解决方案 mentioned in this post on SO .
程序如下:
CREATE DEFINER=`root`@`localhost` PROCEDURE `new_procedure`()
BEGIN
DECLARE n, i INT DEFAULT 0;
DECLARE pid VARCHAR(20);
DROP temporary table if exists tmp;
CREATE temporary table tmp
SELECT
t1.patient_id
FROM
consultation t1
LEFT JOIN diagnosis t2
ON t1.diagnosis_id = t2.diagnosis_id
LEFT JOIN visit t3
ON t3.visit_id = t1.visit_id
LEFT JOIN patient t4
ON t4.patient_id = t3.patient_id
LEFT JOIN diabetes_assessment t5
ON t5.patient_id = t4.patient_id
WHERE
t2.diagnosis_name LIKE '%Diabetes%'
AND t1.clinic_id = '361'
AND t3.visit_status="Active"
GROUP BY t1.patient_id ;
set i=1;
SELECT count(*) INTO n FROM tmp;
SELECT patient_id into pid FROM tmp;
while i<=n DO
set pid = (select patient_id from tmp);
SELECT
t1.patient_id,
CONVERT(aes_decrypt(t4.patient_name_en, 'key') USING utf8mb4) as patient_name_en,
min(t3.date_of_visit) as date_of_visit,
t2.diagnosis_name,
max(ifnull(t5.date_of_assessment, 'N/A')) as date_of_assessment,
ifnull(t5.assessment_result, 0) as assessment_result
FROM consultation t1
LEFT JOIN diagnosis t2
ON t1.diagnosis_id = t2.diagnosis_id
LEFT JOIN visit t3
ON t3.visit_id = t1.visit_id
LEFT JOIN patient t4
ON t4.patient_id = t3.patient_id
LEFT JOIN diabetes_assessment t5
ON t5.patient_id = t4.patient_id
WHERE
t2.diagnosis_name LIKE '%Diabetes%' AND
t1.patient_id = pid AND
t1.clinic_id = '361' AND
t3.visit_status="Active"
GROUP BY
t1.patient_id,
t2.diagnosis_name,
t3.date_of_visit,
t4.patient_name_en,
t5.date_of_assessment,
t5.assessment_result
ORDER BY t5.date_of_assessment DESC LIMIT 1;
set i = i + 1;
END WHILE;
END
我会稍微解释一下。以下查询将通过 patent_id
获取 patent_ids
group by,因此解决了only full group by
的问题:
DROP temporary table if exists tmp;
CREATE temporary table tmp
SELECT t1.patient_id
FROM consultation t1
LEFT JOIN diagnosis t2
ON t1.diagnosis_id = t2.diagnosis_id
LEFT JOIN visit t3
ON t3.visit_id = t1.visit_id
LEFT JOIN patient t4
ON t4.patient_id = t3.patient_id
LEFT JOIN diabetes_assessment t5
ON t5.patient_id = t4.patient_id
WHERE t2.diagnosis_name LIKE '%Diabetes%' AND t1.clinic_id = '361'
AND t3.visit_status="Active"
GROUP BY t1.patient_id ;
然后我将计算这个临时表中有多少行:
set i=1;
SELECT count(*) INTO n FROM tmp;
结果是 2 个患者 ID。
所以我需要迭代每个患者 ID:
select patient_id into pid FROM tmp;
在此查询中:
while i<=n DO
set pid = (select patient_id from tmp);
SELECT
t1.patient_id,
CONVERT(aes_decrypt(t4.patient_name_en, 'key') USING utf8mb4) as patient_name_en,
min(t3.date_of_visit) as date_of_visit,
t2.diagnosis_name,
max(ifnull(t5.date_of_assessment, 'N/A')) as date_of_assessment,
ifnull(t5.assessment_result, 0) as assessment_result
FROM consultation t1
LEFT JOIN diagnosis t2
ON t1.diagnosis_id = t2.diagnosis_id
LEFT JOIN visit t3
ON t3.visit_id = t1.visit_id
LEFT JOIN patient t4
ON t4.patient_id = t3.patient_id
LEFT JOIN diabetes_assessment t5
ON t5.patient_id = t4.patient_id
WHERE
t2.diagnosis_name LIKE '%Diabetes%' AND
t1.patient_id = pid AND
t1.clinic_id = '361' AND
t3.visit_status="Active"
GROUP BY
t1.patient_id,
t2.diagnosis_name,
t3.date_of_visit,
t4.patient_name_en,
t5.date_of_assessment,
t5.assessment_result
ORDER BY t5.date_of_assessment DESC LIMIT 1;
set i = i + 1;
END WHILE;
我认为我的问题出在这两行:
select patient_id into pid FROM tmp;
还有
set pid = (select patient_id from tmp);
错误是:
我不想使用游标,正如我们的教授曾经说过的那样,游标非常足智多谋,但却是不好的做法。
Error Code: 1172. Result consisted of more than one row
最佳答案
如果您获得两个不同的患者 ID 并希望循环访问这两个 ID,则需要使用 CURSOR
,例如:
DECLARE patient_id_cursor CURSOR FOR SELECT patient_id FROM tmp;
OPEN patient_id_cursor;
FETCH cursor_name INTO pid;
/*
Logic to process `pid`
*/
CLOSE patient_id_cursor;
关于MySQL存储过程在不使用游标的情况下迭代多个值返回错误代码: 1172.结果由多于一行组成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45431746/