MySQL 查询选择所需的最后日期但具有与该日期完全无关的不同列值
MySQL query selecting the last date needed but with a different column value that not related to that date at all
我有这个 SQL 查询:
SELECT
t1.patient_id,
CONVERT(aes_decrypt(t4.patient_name_en, 'k') 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,
(SELECT
CASE
WHEN
(period_diff(EXTRACT(YEAR_MONTH FROM now()), EXTRACT(YEAR_MONTH FROM date_of_assessment))>=6)
THEN
'Yes'
ELSE
'No'
END
FROM
diabetes_assessment t5
where t5.patient_id = t1.patient_id LIMIT 1) as assessment_needed
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
ORDER BY
t5.date_of_assessment DESC
我需要 select 不同的列,最多的是 date_of_assessment
、assessment_result
和 case
结果。
这 3 个重要字段的结果有问题。正如您在这一行中看到的:
| 361-9001 | (null) | 2017-03-03 | Diabetes mellitus with diabetic nephropathy | 2017-05-05 | 31 | No |
日期 selected 是对患者进行的最后一次评估日期,但该特定日期的评估结果是 40 和 31。因此查询返回正确的字段,但它只是 select使用与该日期无关的任意评估结果来计算最后日期。
这里是测评数据table:
insert into diabetes_assessment values (1, '361-9001', 361, '2017-04-04', 31);
insert into diabetes_assessment values (2, '361-9001', 361, '2017-05-05', 40);
insert into diabetes_assessment values (3, '361-0361', 361, '2017-03-10', 30.5);
所以结果应该取自这一行:
插入 diabetes_assessment 值 (2, '361-9001', 361, '2017-05-05', 40);
我尝试将 max()
添加到 assessment_result,但它仍然给出错误的未连接数据。
假设您正在使用 mysql
如果您想要未聚合列的值,您应该将查询与聚合结果的结果相匹配,例如在子查询中
(如果你使用 sql-server 而不是 tupr match 你可以在同一个子集上使用内部连接)
编辑:添加缺少的括号
SELECT
t1.patient_id,
CONVERT(aes_decrypt(t4.patient_name_en, 'k') USING utf8mb4) as patient_name_en,
t3.date_of_visit as date_of_visit,
t2.diagnosis_name,
ifnull(t5.date_of_assessment, 'N/A') as date_of_assessment,
ifnull(t5.assessment_result, 0) as assessment_result,
(
SELECT
CASE
WHEN
(period_diff(EXTRACT(YEAR_MONTH FROM now()), EXTRACT(YEAR_MONTH FROM date_of_assessment))>=6)
THEN
'Yes'
ELSE
'No'
END
FROM diabetes_assessment t5
where t5.patient_id = t1.patient_id LIMIT 1
) as assessment_needed
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'
AND ( t1.patient_id,t3.date_of_visit, ifnull(t5.date_of_assessment, 'N/A')) IN (
SELECT
t1.patient_id,
min(t3.date_of_visit) as date_of_visit,
max(ifnull(t5.date_of_assessment, 'N/A')) as date_of_assessment
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
ORDER BY t5.date_of_assessment DESC
)
ORDER BY t5.date_of_assessment DESC
NB 在表上使用左连接,并且在相同表上的条件与 INNER JOIN 一样工作
我有这个 SQL 查询:
SELECT
t1.patient_id,
CONVERT(aes_decrypt(t4.patient_name_en, 'k') 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,
(SELECT
CASE
WHEN
(period_diff(EXTRACT(YEAR_MONTH FROM now()), EXTRACT(YEAR_MONTH FROM date_of_assessment))>=6)
THEN
'Yes'
ELSE
'No'
END
FROM
diabetes_assessment t5
where t5.patient_id = t1.patient_id LIMIT 1) as assessment_needed
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
ORDER BY
t5.date_of_assessment DESC
我需要 select 不同的列,最多的是 date_of_assessment
、assessment_result
和 case
结果。
这 3 个重要字段的结果有问题。正如您在这一行中看到的:
| 361-9001 | (null) | 2017-03-03 | Diabetes mellitus with diabetic nephropathy | 2017-05-05 | 31 | No |
日期 selected 是对患者进行的最后一次评估日期,但该特定日期的评估结果是 40 和 31。因此查询返回正确的字段,但它只是 select使用与该日期无关的任意评估结果来计算最后日期。
这里是测评数据table:
insert into diabetes_assessment values (1, '361-9001', 361, '2017-04-04', 31);
insert into diabetes_assessment values (2, '361-9001', 361, '2017-05-05', 40);
insert into diabetes_assessment values (3, '361-0361', 361, '2017-03-10', 30.5);
所以结果应该取自这一行:
插入 diabetes_assessment 值 (2, '361-9001', 361, '2017-05-05', 40);
我尝试将 max()
添加到 assessment_result,但它仍然给出错误的未连接数据。
假设您正在使用 mysql 如果您想要未聚合列的值,您应该将查询与聚合结果的结果相匹配,例如在子查询中 (如果你使用 sql-server 而不是 tupr match 你可以在同一个子集上使用内部连接)
编辑:添加缺少的括号
SELECT
t1.patient_id,
CONVERT(aes_decrypt(t4.patient_name_en, 'k') USING utf8mb4) as patient_name_en,
t3.date_of_visit as date_of_visit,
t2.diagnosis_name,
ifnull(t5.date_of_assessment, 'N/A') as date_of_assessment,
ifnull(t5.assessment_result, 0) as assessment_result,
(
SELECT
CASE
WHEN
(period_diff(EXTRACT(YEAR_MONTH FROM now()), EXTRACT(YEAR_MONTH FROM date_of_assessment))>=6)
THEN
'Yes'
ELSE
'No'
END
FROM diabetes_assessment t5
where t5.patient_id = t1.patient_id LIMIT 1
) as assessment_needed
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'
AND ( t1.patient_id,t3.date_of_visit, ifnull(t5.date_of_assessment, 'N/A')) IN (
SELECT
t1.patient_id,
min(t3.date_of_visit) as date_of_visit,
max(ifnull(t5.date_of_assessment, 'N/A')) as date_of_assessment
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
ORDER BY t5.date_of_assessment DESC
)
ORDER BY t5.date_of_assessment DESC
NB 在表上使用左连接,并且在相同表上的条件与 INNER JOIN 一样工作