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_assessmentassessment_resultcase 结果。

这里是an SQL Fiddle about it

这 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 一样工作