2017-07-31 65 views
-1

我问SO this question few days ago但没有有效的答案。使用子查询按特定列分组输出相同的错误结果

的问题是,下面的查询:

SELECT t1.patient_id, 
CONVERT(aes_decrypt(t4.patient_name_en, :encKey) 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 :diagName AND t1.clinic_id = :cid 
AND t3.visit_status=:visit_status 
GROUP BY t1.patient_id, t5.date_of_assessment, t4.patient_name_en, t3.date_of_visit, t2.diagnosis_name, t5.assessment_result 
ORDER BY t5.date_of_assessment DESC 

是给下面的结果:

enter image description here

但我真正想要的是一群只patient_id所以我只能得到每一位患者早期诊断为糖尿病一行。

我搜索了很多,发现我可以在这个查询中使用子查询。

于是我想出了下面的子查询:

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 

结果被patient_id分组,我拿到了2号是真的想和不多。即使是ID 0361的患者在每次到诊所时都被诊断为患有多种类型的糖尿病,但是它的身份证显示了一次。

现在我想利用这个子查询,并把它添加到最初的一个:

SELECT t1.patient_id, 
CONVERT(aes_decrypt(t4.patient_name_en, 'key1') 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 t1.patient_id IN 
(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) AND 
t2.diagnosis_name LIKE '%Diabetes%' AND t1.clinic_id = '361' 
AND t3.visit_status="Active" 
GROUP BY t1.patient_id, t5.date_of_assessment, t4.patient_name_en, t3.date_of_visit, t2.diagnosis_name, t5.assessment_result 
ORDER BY t5.date_of_assessment DESC 

但我已经得到了图像的相同的结果如上所述,在每个例子patient_id=0361 4行显示,但我想要显示一次,与他第一次被诊断为糖尿病的日期。

+0

查询看起来像是一团糟,没有看到数据我不惊讶,你以前没有答案。也许如果你可以简化你的问题,也许只有2-3个表的联合,这可能会更容易在这里得到帮助。 –

+0

也许如果你听过评论中提供的宝贵意见 – Strawberry

+0

伙计们,我不知道如何创建sql小提琴。另外我有6桌。将需要一个小时来创建一个小提琴的权利? – droidnation

回答

0

你最终的目标是什么?

只取得patient_id,date_of_assessment?那么你只需要“group by”1列。像:

select patient_id, min(date_of_assessment) from .... where .... group by patient_id 

如果你需要列出在同一列的诊断,你将需要使用MySQL特定的东西,如:

select patient_id, min(date_of_assessment), GROUP_CONCAT(diagnosis SEPARATOR ' ') from .... where ... group by patient_id 

事情是你需要给数据库的方式来计算您未分组的列的值。它可以是总和,计数,最小值,最大值,...

1
SELECT t.patient_id, 
CONVERT(aes_decrypt(t4.patient_name_en, 'key1') USING utf8mb4) as patient_name_en, 
mindate as date_of_visit, 
tt2.diagnosis_name, 
max(ifnull(tt5.date_of_assessment, 'N/A')) as date_of_assessment, 
ifnull(tt5.assessment_result, 0) as assessment_result 
FROM consultation t 
LEFT JOIN visit tt3 ON tt3.visit_id = t.visit_id 
LEFT JOIN diagnosis tt2 ON t1.diagnosis_id = tt2.diagnosis_id 
INNER JOIN 
(
    SELECT t1.patient_id,min(t3.date_of_visit) mindate 
    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 
    WHERE t2.diagnosis_name LIKE '%Diabetes%' AND t1.clinic_id = '361' 
    AND t3.visit_status="Active" 
    GROUP BY t1.patient_id 
)INNERTABLE ON t.patient_id=INNERTABLE.patient_id and INNERTABLE.mindate 
LEFT JOIN patient t4 ON t4.patient_id = tt3.patient_id 
LEFT JOIN diabetes_assessment t5 ON t5.patient_id = t4.patient_id 

试试上面的查询。

+0

我会试试看,并回复你。 – droidnation

相关问题