【问题标题】:Excluding results in MySQL on JOIN在 JOIN 上排除 MySQL 中的结果
【发布时间】:2013-12-06 16:20:48
【问题描述】:

下面是我的 MySQL 语句:

select
    tableT.id,
    tableTGroupName,
    tableTGroupSortOrder,
    tableT_group.Deleted as tableTGroupDeleted,
    tableTSuiteName,
    tableTSuiteSortOrder,
    tableT_suite.Deleted as tableTSuiteDeleted,
    tableTCaseName, 
    tableTCaseSortOrder,
    tableT_case.Deleted as tableTCaseDeleted,
    DbPackageName,
    E_imgLR as Eimg, 
    R_imgLR as Rimg,
    tableTResultState,
    tableTResultComment
from 
    tableT_result
    inner join tableT on tableT_id = tableT.id
    inner join tableT_run on tableT_run_id = tableT_run.id
    inner join db_package on db_package_id = db_package.id
    inner join tableT_case on tableT_case_id = tableT_case.id
    inner join tableT_suite on tableT_suite_id = tableT_suite.id
    inner join tableT_group on tableT_group_id = tableT_group.id
    left outer join E_img_lo_r on tableT_case.e_img_id = E_img_lo_r.e_img_id or tableT_suite.e_img_id = E_img_lo_r.e_img_id -- Problematic line
    left outer join result_image_low_res on tableT_result.result_image_id = result_image_low_res.result_image_id
where
    db_package_label_id = ?
order by 
    tableTGroupSortOrder, 
    tableTSuiteSortOrder, 
    tableTCaseSortOrder

最后这个语句给了我 16 行,3 行(结果)是多余的。 3 x 2 行具有相同的 ID,例如:(234,234) (71,71) (445,445)。行

left outer join E_img_lo_r on tableT_case.e_img_id = E_img_lo_r.e_img_id or tableT_suite.e_img_id = E_img_lo_r.e_img_id

因此,我可以使用 DISTINCT 消除重复的 ID,但行的内容不一样。这就是为什么我不想删除必要的行。

我的目的是首先检查“tableT_case”是否有图像,如果有则使用它,如果没有使用“tableT_suite”中的那个,如果“tableT_suite”也没有图像则使用默认的“无图像” ”。 Afaik if-else 在 join 语句上是不可能的。当两个表都包含一个图像时,它需要两个我不想要的。我需要这个用于 Birt 报告,我们不想在报告上显示错误的图像。我很乐意提供任何提示。

【问题讨论】:

  • 我无法面对使用该命名策略
  • 不确定我是否关注所有内容,但您可能想查看COALESCE
  • @Strawberry 我不得不稍微使用表名来消耗隐私......我知道它们看起来很傻......

标签: mysql sql join birt


【解决方案1】:

您可以添加一个and 吗?将有问题的行改为:

left outer join E_img_lo_r
on
tableT_case.e_img_id = E_img_lo_r.e_img_id
or 
(
    tableT_case.e_img_id != E_img_lo_r.e_img_id
    and
    tableT_suite.e_img_id = E_img_lo_r.e_img_id
)

【讨论】:

  • 我需要“tableT_case”中的图片,这就是我不能制作的原因!=
  • 这就是它的作用...它为您提供来自 E_img_lo_r 的与 T_Case 中的 ID 匹配的记录,并且仅当 T_Case 中的 ID 没有任何匹配的记录时,它才会为您提供匹配的记录而是来自 T_Suite 的 ID。当您说“我的目的是首先检查“tableT_case”是否有图像时,这不正是您所要求的,如果是,则使用它,如果不使用“tableT_suite”中的那个,如果“tableT_suite”也没有图像然后采用默认的“无图像”。”???
  • 对不起,我只是阅读了“或”之后的部分作为您的答案,但是您的语句给出的结果与问题行完全相同,返回 16 行,基本上是一样的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
  • 2016-10-07
  • 2016-10-18
  • 2013-10-07
  • 2019-01-18
  • 1970-01-01
相关资源
最近更新 更多