2017-08-01 109 views
-3

我有this unanswered question在那里我有这个错误的结果查询得到,因为只有完全组的模式的错误结果:MySQL查询通过

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, 
    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 

,给了我这样的结果:

enter image description here

新的事情是,我尝试使用子查询环路下面的查询通过patient_id

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 

而且我已经得到以高于图像显示同样的结果。

Here is the an sql fiddle about my problem

我真正想要的是仅显示以下两排它通过patient_id意味着组。

enter image description here

而对于几个原因,我不能禁用only_full_group_by模式,因为我读它可能会给一些错误的结果

我试图只用patient_id在小提琴中分组,显然它工作正常,因为小提琴的only_full_group_by禁用。

我该怎么办?

  1. 创建一个PHP解决方案,其中我中断查询到2,第一个是在子查询,其中我将获得的ID,然后使用外部查询在foreach获得行使用LIMIT 1每个ID ?
  2. 或禁用only_full_group_by mode这会影响我的其他在我的各方面应用的查询?
  3. 创建存储的过程,而不是将溶液#1中的SQL?
+0

这个查询是一个烂摊子,我不会尝试的答案,但我会问你为什么想到关闭'only_full_group_by'模式会_什么都没有?它允许一种更宽松的查询类型,但正确使用“GROUP BY”的现有查询不应受到影响(我认为)。 –

+1

该查询是多个表的简单左连接。而已。 – droidnation

+0

不清楚你的目标..为什么你只想为病人两行..为什么不是别人诊断.. ????? ..尝试解释你想要什么..你想要第一次诊断? – scaisEdge

回答

0

GROUP BY中的列必须是要返回的列。因此,而不是t5. assessment_result it should just be assessment_result because this is the alias of the IFNULL()`的表达。

另外,您不应该在GROUP BY中包含聚合函数的结果,所以请不要在那里使用t5.date_of_assessmentt3.date_of_visit

+0

它没有工作 – droidnation

0

尝试使用 group_concat(column_name separator ', ')group_concat() doc

这将有助于串连根据你几乎需要的组行