mysql左连接查询

时间:2011-02-16 15:12:32

标签: mysql select

我对下面的代码段有疑问。我想知道,如果第一个查询没有带来任何结果,我仍会得到第二个查询的结果吗?

select *
from
(
  -- first query
) as query1
left join
(
  -- second query
) as query2
on query1.id=query2.id
left join
(
  -- third query
) as query3
on query1.id=query3.id;

更新

我需要的是一个完整的连接,但是,MySQL不支持它,什么是模拟它的好方法?

4 个答案:

答案 0 :(得分:3)

答案是否定的。

左连接将从左侧拉出所有结果,并且只有右侧匹配的结果。右连接反过来。完全外部联接将从两者中提取所有结果,并仅加入可以加入的结果。

请注意,对于当前数据库,最好避免使用完全外连接,因为它们的效率远低于其他连接。我亲自设法通过这样的技巧在数量级上击败了Oracle和PostgreSQL中的完全外连接,这也可以用来模拟没有它们的数据库中的完全外连接:

SELECT some_id
  , MAX(foo) AS foo
  , MAX(bar) AS bar
  , MAX(baz) AS baz
  , MAX(blat) AS blat
FROM (
      SELECT A.some_id
        , A.foo
        , A.bar
        , NULL as baz
        , NULL as blat
      FROM A
    UNION ALL
      SELECT B.some_id
        , NULL as foo
        , NULL as bar
        , B.baz
        , B.blat
      FROM B
  ) AS subquery
GROUP BY some_id;

此查询可能无法正常工作,因为数据库无法确定空列的类型。有解决方法。最简单的方法是使用显式列类型创建临时表,使用2个插入查询模拟UNION ALL,然后查询临时表。

(有关格式样式的说明,请参阅http://bentilly.blogspot.com/2011/02/sql-formatting-style.html。)

答案 1 :(得分:1)

不,你需要做一个正确的加入。

答案 2 :(得分:0)

不,因为第二个查询的结果会附加到第一个查询的结果中。

答案 3 :(得分:0)

不,因为你已离开加入。第二个记录被添加到第一个。如果没有第一个没有记录从第二个可以添加。通过右连接可以实现反转。