【问题标题】:MySQL LEFT JOIN -- How to still return results when leftmost table is empty?MySQL LEFT JOIN - 当最左边的表为空时如何仍然返回结果?
【发布时间】:2013-08-03 20:54:01
【问题描述】:

我正在尝试将三个单独的查询合并为一个。每个查询从不同的表中选择不同的列,但这些表确实有一些共同的列。

我尝试做的是 LEFT JOINing 两个表到另一个,只要最左边的表返回结果,这很有效。但是如果最左边的表没有返回结果,那么就根本没有返回结果(即使被 LEFT JOINed 的两个查询有结果)。

伪代码:

SELECT a.col_1, b.col_2, c.col_3
FROM tableA a 
LEFT JOIN tableB b ON b.someCol = a.someCol
LEFT JOIN tableC c ON c.someCol = a.someCOL
WHERE a.anotherCol = :someVal AND a.yetAnotherCol = :anotherVal

如果 tableA 有结果,那么查询结果就是我想要的(即它返回 col_1、col_2|null 和 col_3|null 的三列)。但是如果tableA没有结果,那么查询返回null。

当左连接字符串中最左边的表没有结果时,有什么方法仍然返回结果?

【问题讨论】:

    标签: mysql join


    【解决方案1】:

    你有问题。 left join 将所有内容保存在第一个表中。听起来您想要更像full outer join 的东西,这是 MySQL 不支持的。但是,有一个很好的解决方法。

    听起来您的查询格式如下:

    select . . .
    from t1 left join
         t2
         on t1.t1id = t2.t1id left join
         t3
         on t1.t1id = t3.t1id;
    

    将所有 id 放在一起,然后进行连接:

    select . . .
    from (select t1id
          from ((select t1id from t1) union
                (select t1id from t2) union
                (select t1id from t3)
               ) driver left join
               t1
               on t1.t1id = driver.t1id left join
               t2
               on t2.t1id = driver.t1id left join
               t3
               on t3.t1id = driver.t1id;
         )
    

    driver 将包含您想要从其他表中获取的所有“t1”ID。它可能不包括所有表,因为有些表可能会加入其他 id。

    并且,driver 子查询中的 union 是有意的。您想删除重复项。

    【讨论】:

    • +1 只是想粘贴我的答案,但看到你先做了:)
    猜你喜欢
    • 2019-03-25
    • 2012-03-27
    • 2017-03-16
    • 2013-11-28
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多