Запрос 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 

Что дает мне этот результат:

введите здесь описание изображения

Новое заключается в том, что я попробовал следующий запрос, используя подзапрос для цикла 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 

И у меня есть тот же результат, показанный на изображении выше.

Вот скрипка sql о моей проблеме

Что я действительно хочу, так это показать только следующие две строки, что означает группировку по patient_id.

введите здесь описание изображения

И по нескольким причинам я не могу отключить режим only_full_group_by, потому что я читал, что это может привести к ошибочному результату.

Я попытался сгруппировать только по patient_id в скрипке, и, по-видимому, она работает правильно, потому что в скрипке отключен only_full_group_by.

Что я должен делать ?

  1. Создайте решение PHP, в котором я разбиваю запрос на 2, первый — это подзапрос, в котором я получу идентификаторы, а затем использую внешний запрос в foreach, чтобы получить строку для каждого идентификатора, используя LIMIT 1?
  2. Или отключить only_full_group_by mode, который повлияет на другие мои запросы в моем приложении по разным аспектам?
  3. Создать хранимую процедуру sql вместо решения №1?

person alim1990    schedule 01.08.2017    source источник
comment
Этот запрос беспорядок, и я не буду пытаться ответить, но я спрошу, почему вы ожидаете, что отключение режима only_full_group_by что-нибудь сломает? Это позволяет использовать более слабый тип запроса, но существующие запросы, которые правильно используют GROUP BY, не должны быть затронуты (я думаю).   -  person Tim Biegeleisen    schedule 01.08.2017
comment
Запрос представляет собой простое левое соединение для нескольких таблиц. Вот и все.   -  person alim1990    schedule 01.08.2017
comment
не ясна ваша цель .. почему вы хотите только два ряда для пациентов .. почему не другие диагнозы .. ????? ..попробуй объясни что ты хочешь ..хочешь первый диагноз ????   -  person scaisEdge    schedule 01.08.2017
comment
потому что я ищу только пациентов, у которых есть diabetes, а иногда у пациента диагностируются разные его типы. Чего я хочу, так это посетить его в первый раз, когда ему поставили какой-либо диагноз, и показать это. См. id=361-9001, у него было диагностировано два типа, что меня волнует, так это показать одну строку с первой датой   -  person alim1990    schedule 01.08.2017
comment
Чтобы исправить группу по ошибкам, просто перестаньте выбирать неагрегированные столбцы. Вам может понадобиться подзапрос для неагрегированных столбцов, вызывающих проблему.   -  person Tim Biegeleisen    schedule 01.08.2017
comment
тогда вы группируете по t3.date_of_visit ... вы делаете это ... у вас есть все строки ... попробуйте удалить эту группу формы условия с помощью   -  person scaisEdge    schedule 01.08.2017
comment
И как узнать, какие столбцы не являются агрегированными.   -  person alim1990    schedule 01.08.2017
comment
столбцы, которые не имеют функции агрегирования (минимум, максимум, количество...)   -  person scaisEdge    schedule 01.08.2017
comment
в любом случае, если вам нужны строки с min(date_of_visit), вы должны добавить свою схему.. чтобы увидеть, как выбрать это подмножество или значения из связанных значений   -  person scaisEdge    schedule 01.08.2017
comment
посмотри на скрипку, там схема есть   -  person alim1990    schedule 01.08.2017
comment
Итак, ребята, можно ли отключить запрос и нет необходимости изменять другие 45 запросов, которые у меня уже есть в моем проекте? И не нужно менять ни один из них, верно?   -  person alim1990    schedule 01.08.2017


Ответы (2)


Столбцы в GROUP BY должны быть возвращаемыми столбцами. Поэтому вместо выражения t5.assessment_resultit should just beassessment_resultbecause this is the alias of theIFNULL()`.

Также не следует включать результаты функций агрегации в GROUP BY, поэтому не используйте там t5.date_of_assessment или t3.date_of_visit.

person Barmar    schedule 01.08.2017
comment
это не сработало - person alim1990; 01.08.2017