MySQL Left Join возвращает несвязанные записи, несмотря на использование IS NOT NULL - PullRequest
0 голосов
/ 13 марта 2020

Следующий запрос с левыми объединениями возвращает записи, которые не совпадают с последним левым соединением, т. Е. Столбец оценки пуст, хотя у меня есть запрос с IS NOT NULL.

Как изменить запрос, чтобы получить только совпадающие записи?

По сути, я хочу вернуть записи unit_outcome GROUPED согласно соответствующим оценкам в таблице поиска.

DB Fiddle для LEFT JOIN , показывающая записи с нулем для оценки

SELECT *
  FROM unit
  left JOIN unit_unit_outcome_lookup
    ON unit_unit_outcome_lookup.unit_fk = unit.unit_pk
  left JOIN unit_outcome
    ON unit_outcome.unit_outcome_pk = unit_unit_outcome_lookup.unit_outcome_fk
  left JOIN unit_outcome_assessment_lookup
    ON unit_outcome_assessment_lookup.unit_outcome_fk = unit_outcome.unit_outcome_pk IS NOT NULL
  left JOIN assessment
    ON assessment.assessment_pk = unit_outcome_assessment_lookup.assessment_fk IS NOT NULL
    AND unit.unit_pk ='1'

DB Fiddle для INNER JOIN без нулевых записей - как сгруппировать unit_outcomes по оценке?

Ответы [ 2 ]

1 голос
/ 13 марта 2020
SELECT MAX((unit.unit_pk)) AS unit_pk,
       GROUP_CONCAT(unit_outcome.unit_outcome) unit_outcomes,
       MAX(assessment.assessment) assessment,
       GROUP_CONCAT(unit_outcome.unit_outcome_pk) unit_outcome_pks, 
       assessment.assessment_pk
FROM unit
INNER JOIN unit_unit_outcome_lookup
    ON unit_unit_outcome_lookup.unit_fk = unit.unit_pk
INNER JOIN unit_outcome
    ON unit_outcome.unit_outcome_pk = unit_unit_outcome_lookup.unit_outcome_fk
INNER JOIN unit_outcome_assessment_lookup
    ON unit_outcome_assessment_lookup.unit_outcome_fk = unit_outcome.unit_outcome_pk
INNER JOIN assessment
    ON assessment.assessment_pk = unit_outcome_assessment_lookup.assessment_fk
    AND unit.unit_pk ='1'
GROUP BY assessment_pk;

скрипка

PS. Подробности можно найти в комментариях к вопросу.

1 голос
/ 13 марта 2020

Проблема в следующем:

unit_outcome_assessment_lookup.unit_outcome_fk = unit_outcome.unit_outcome_pk IS NOT NULL

Если вы хотите выбрать только то, что существует в другой таблице используйте INNER JOIN или JOIN. Давайте разберемся, как работает объединение: https://www.w3schools.com/sql/sql_join.asp.

Также используйте ALIAS для таблиц, чтобы упростить чтение запроса.

SELECT *
  FROM unit u
  LEFT JOIN unit_unit_outcome_lookup uuol ON uuol.unit_fk = u.unit_pk
  LEFT JOIN unit_outcome uo ON uo.unit_outcome_pk = uuol.unit_outcome_fk
  JOIN unit_outcome_assessment_lookup uoal ON uoal.unit_outcome_fk = uo.unit_outcome_pk
  JOIN assessment a ON a.assessment_pk = uoal.assessment_fk
WHERE u.unit_pk ='1'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...