【问题标题】:Query with multiple joins will only return one of my left joins具有多个联接的查询将仅返回我的左联接之一
【发布时间】:2010-11-19 14:28:20
【问题描述】:

我在查询时遇到问题,问题是我从同一个表中加入了 3 次。

有问题的查询是这样的:

SELECT
      o.order_id, 
      n.title, 
      c.first_name,
      tdv5.tid,
      tdv6.name,
      tdv8.name AS settlement_month
 FROM orders o
      join products p           on o.product_id = p.nid
      join node n               on p.nid = n.nid
      join customers c          on o.customer_email = c.customer_email
      join term_node tn         on tn.nid = p.nid
      join term_data tdv6       on tn.tid = tdv6.tid AND tdv6.vid = 6
      left join term_data tdv5  on tn.tid = tdv5.tid AND tdv5.vid = 5
      left join term_data tdv8  on tn.tid = tdv8.tid AND tdv8.vid = 8

当我使用这个查询时,只有使用 tn.tid 的第一个 JOIN 才能工作。例如,如果最后三个中唯一的连接是这样的:

join term_data tdv6       on tn.tid = tdv6.tid AND tdv6.vid = 6

它会正常工作的。与

相同
left join term_data tdv5  on tn.tid = tdv5.tid AND tdv5.vid = 5

还有

left join term_data tdv8  on tn.tid = tdv8.tid AND tdv8.vid = 8

但是,当我将它们结合起来时,它们根本不起作用。当我结合这三个查询时,只有 tdv6 有效。

您对哪里出了问题有什么建议吗?谢谢。

【问题讨论】:

    标签: mysql join left-join


    【解决方案1】:

    如果您尝试放置 WHERE 子句,如下所示:

    SELECT
          o.order_id, 
          n.title, 
          c.first_name,
          tdv5.tid,
          tdv6.name,
          tdv8.name AS settlement_month
     FROM orders o
          join products p           on o.product_id = p.nid
          join node n               on p.nid = n.nid
          join customers c          on o.customer_email = c.customer_email
          join term_node tn         on tn.nid = p.nid
          join term_data tdv6       on tn.tid = tdv6.tid
          left join term_data tdv5  on tn.tid = tdv5.tid
          left join term_data tdv8  on tn.tid = tdv8.tid
    WHERE
          tdv6.vid = 6 and
          tdv5.vid = 5 and
          tdv8.vid = 8
    

    【讨论】:

    • 那么它根本不会返回任何行。对于不返回任何内容的左连接,我需要 NULL 值。
    • 将条件放在 WHERE 中有效地使您的左连接成为内连接。
    【解决方案2】:

    你确定你的结论是正确的吗?空值会出现在相同行,所以当没有term_data.tid= = tn.tid and term_data.vid in (5, 8)的记录时,你只会得到tdv6。对于这些记录,tid 和/或结算月将为 NULL。

    你是不是也想离开加入 tdv6?它现在是一个内部连接,这意味着您需要 tdv6 中的一条记录才能从 tdv5 或 tdv8 中获取具有相同 tid 的记录。

    【讨论】:

    • 如果可用,我需要行中的所有 3 条信息。这可能吗?
    • 您是否尝试过将 tdv6 上的 (INNER) JOIN 转换为 LEFT JOIN,就像我建议的那样?这应该可以解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 2012-02-16
    • 2018-03-30
    相关资源
    最近更新 更多