【问题标题】:LEFT JOIN to show NULL rows + WHERELEFT JOIN 显示 NULL 行 + WHERE
【发布时间】:2018-07-26 11:24:19
【问题描述】:

我有两张表,一张包含唯一名称(bill_datatypes),另一张表示这些名称连接到某些子类别(一个名称也可以连接到更多类别)。

第一张表(相关部分):

第二张表(相关部分):

我想选择所有尚未连接到特定子类别的名称。这意味着名称可能在连接表中被提及,但连接到不同的子类别。

我已经用下面的子查询解决了这个问题:

SELECT T1.name
FROM bill_datatype T1
WHERE NOT EXISTS (

SELECT T2.bill_datatype_id
FROM obligatory_field T2
WHERE T2.bill_datatype_id = T1.id AND T2.bill_sub_category_id = 1

)

这个解决方案似乎效果很好,但是这样我就不能从第二个表中获得任何数据,这可能是将来需要的。

您对如何使用 LEFT JOIN 解决问题有什么建议吗? (子类别上的 WHERE 子句对我来说太具有挑战性了。)

也提前感谢您的帮助!

【问题讨论】:

    标签: mysql join subquery left-join


    【解决方案1】:

    从我对你的问题的理解来看,我认为这个查询会达到你想要的效果:

    SELECT T1.name
    FROM bill_datatype T1
    LEFT JOIN obligatory_field T2
    ON T2.bill_datatype_id = T1.id AND T2.bill_sub_category_id = 1
    WHERE T2.bill_datatype_id IS NULL
    

    JOIN'ed 表上的WHERE 条件将只为您提供T1 中没有bill_sub_category_id 或它们的bill_sub_category_id 不是1 的名称。

    SQLFiddle

    【讨论】:

      【解决方案2】:
      SELECT distinct T1.name
      FROM 
      bill_datatype T1 
      right join
      (
      
      SELECT T2.bill_datatype_id
      FROM obligatory_field T2
      WHERE  T2.bill_sub_category_id = 1
      
      ) 
      as T3
      on T1.id != T3.bill_datatype_id 
      

      http://sqlfiddle.com/#!9/d4f616/18

      【讨论】:

      • 这准确显示了连接到 sub_category #1 的行。我需要所有与此子类别无关的。
      • 抱歉,我仍然认为这不能解决问题。我需要表 1 中未在表 2 中使用特定 sub_category_id(例如 1)提及的所有行。
      • 你能和我聊聊更多细节吗
      • 您能否检查此链接sqlfiddle.com/#!9/963f29/2 作为输出是否适合您,或者请查看并分享将从此处输出的内容
      • 我编辑了架构并添加了我的工作子查询解决方案,以显示所需的输出 sqlfiddle.com/#!9/d4f616/2 感谢您的帮助!
      猜你喜欢
      • 2018-12-04
      • 2014-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-29
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      相关资源
      最近更新 更多