由于只有完整组的模式,MySQL查询给出错误结果[重复]
Posted
技术标签:
【中文标题】由于只有完整组的模式,MySQL查询给出错误结果[重复]【英文标题】:MySQL query giving erroneous results because of the mode of only full group by [duplicate] 【发布时间】:2017-08-01 05:53:38 【问题描述】:我有 this unanswered question 我有这个错误的结果查询:
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
这给了我这个结果:
新的事情是我尝试使用子查询循环通过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
分组。
由于某些原因,我无法禁用only_full_group_by
模式,因为我阅读它可能会给出一些错误结果。
我尝试只在小提琴中按patient_id
分组,显然它可以正常工作,因为小提琴禁用了only_full_group_by
。
我该怎么办?
-
创建一个 php 解决方案,我将查询分成 2 个,第一个是子查询,我将在其中获取 ID,然后使用
foreach
中的外部查询使用 LIMIT 1 为每个 ID 获取一行?
或者禁用only_full_group_by mode
,这会影响我在应用程序中不同方面的其他查询?
创建一个 sql 存储过程而不是解决方案 #1?
【问题讨论】:
这个查询一团糟,我不会尝试回答,但我会问你为什么认为关闭only_full_group_by
模式会破坏任何东西?它允许更宽松的查询类型,但正确使用GROUP BY
的现有查询不应该受到影响(我认为)。
查询是多个表的简单左连接。就是这样。
不清楚你的目标..为什么你只想要病人的两行..为什么不给其他人诊断..????? ..试着解释你想要什么..你想要第一次诊断????
因为我只搜索拥有diabetes
的患者,而且有时患者被诊断出患有不同类型的患者。我想要的是在他被诊断出任何类型时进行第一次访问并展示它。看到id=361-9001
,他被诊断为两种类型,我关心的是显示一行与第一个日期
要通过错误修复组,只需停止选择非聚合列。您可能需要对导致问题的非聚合列进行子查询。
【参考方案1】:
GROUP BY
中的列必须是要返回的列。所以不是t5.
assessment_resultit should just be
assessment_resultbecause this is the alias of the
IFNULL()`表达式。
另外,你不应该在GROUP BY
中包含聚合函数的结果,所以不要在那里使用t5.date_of_assessment
或t3.date_of_visit
。
【讨论】:
没用【参考方案2】:尝试使用
group_concat(column_name separator ', ')
。
group_concat() doc
这将有助于根据您想要的组连接行
【讨论】:
以上是关于由于只有完整组的模式,MySQL查询给出错误结果[重复]的主要内容,如果未能解决你的问题,请参考以下文章