【问题标题】:MySQL Left Join returning unrelated records despite using IS NOT NULL尽管使用了 IS NOT NULL,但 MySQL Left Join 返回不相关的记录
【发布时间】:2020-03-13 04:32:29
【问题描述】:

以下带有左连接的查询返回在最终左连接上没有匹配的记录,即评估列为空,尽管我有带有 IS NOT NULL 的查询。

应如何更改查询以获取匹配的记录?

基本上我想根据查找表中的相关评估返回unit_outcome记录GROUPED。

DB Fiddle for 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 for INNER JOIN 没有空记录 - 如何按评估对 unit_outcomes 进行分组?

【问题讨论】:

  • ONassessment.assessment_pk = unit_outcome_assessment_lookup.assessment_fk IS NOT NULL你认为执行了什么操作:ON (assessment.assessment_pk = unit_outcome_assessment_lookup.assessment_fk) IS NOT NULLON assessment.assessment_pk = (unit_outcome_assessment_lookup.assessment_fk IS NOT NULL)
  • 你需要添加where条件,你检查的地方不为空
  • @Akina 不返回评估表中没有相关评估的结果
  • o_O 使用 INNER JOIN 而不是 LEFT...
  • @Mangesh Auti 你能告诉我小提琴的叉子吗?

标签: mysql


【解决方案1】:
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;

fiddle

PS。详情可以在问题的 cmets 中找到。

【讨论】:

    【解决方案2】:

    问题是这个,

    unit_outcome_assessment_lookup.unit_outcome_fk = unit_outcome.unit_outcome_pk 不为空

    如果您只想选择另一个表中存在的内容,请使用 INNER JOIN 或 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'
    

    【讨论】:

      猜你喜欢
      • 2019-03-25
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多