0

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

我尝试做的是 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。

当 LEFT JOIN 字符串中最左边的表没有结果时,有什么方法可以返回结果?

4

1 回答 1

3

你有问题。将left join所有内容保存在第一个表中。听起来您想要更像 a 的东西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。

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

于 2013-08-03T20:57:58.037 回答