由于只有完整组的模式,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 beassessment_resultbecause this is the alias of theIFNULL()`表达式。

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

【讨论】:

没用【参考方案2】:

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

这将有助于根据您想要的组连接行

【讨论】:

以上是关于由于只有完整组的模式,MySQL查询给出错误结果[重复]的主要内容,如果未能解决你的问题,请参考以下文章

PHP中的MySQL查询给出了明显的错误结果

MySql 限制和偏移量给出错误的结果

mysql用总和加入3个表给出错误的结果

如何在MySQL中连接两个字符串

获取每个月 SQL 的组的 MAX 值

解决mysql查询,in条件参数为带逗号的字符串,查询结果错误