Mysql - 左加入所有表

时间:2013-07-15 18:33:05

标签: mysql sql join

我有一个看起来像的查询:

SELECT 'asdf', '123' ...
FROM table1

LEFT JOIN table2
on
(
    condition1
)

LEFT JOIN table3
on
(
    condition2
)

where
(
    main_condition
)

现在的问题是,我还需要有条件地包含table1。我试过这个:

..
..
FROM table1
on
(
    new_condition
)
..
..

但它不起作用。请帮忙。


编辑(新发现): 在这篇文章(http://blog.sqlauthority.com/2010/07/20/sql-server-select-from-dual-dual-equivalent/)中,我找到了这段代码:

SELECT 1 as i, f.bar, f.jar FROM dual LEFT JOIN foo AS f on f.bar = 1 WHERE dual.dummy = ‘X’
UNION
SELECT 2 as i, f.bar, f.jar FROM dual LEFT JOIN foo AS f on f.bar = 2 WHERE dual.dummy = ‘X’

我确定它与我正在尝试做的事情没有直接关系,但可以JOIN这样的表格DUAL吗?

5 个答案:

答案 0 :(得分:3)

虚拟表:

首先从虚拟表中选择一条记录。 dual就是这样一个表,它是为了这个目的而在MySQL中内置的。我将dual包裹在一个子选择中,因为MySQL显然不允许左加入它。

SELECT 'asdf', '123' ...
FROM 
  (select 1 from dual) d
LEFT JOIN table1
on(
  new_condition
)
LEFT JOIN table2
on
(
    condition1
)

LEFT JOIN table3
on
(
    condition2
)

完整(外部)加入

另一种解决方案虽然不同,但使用full joinfull outer join,就像left joinright join一样。这是完全不同的,虽然你可以得到一个非常相似的结果:

select
  *
from
  table1
  full outer join table2 on joincondition.

在上面的查询中,即使两个表中都没有匹配的记录,也会返回两个表中的所有记录。

答案 1 :(得分:1)

感谢您为讨论做出贡献。我找到了答案。这很简单:

SELECT temp_table.* FROM
    (SELECT 'asdf', '123' ... FROM DUAL) temp_table
LEFT JOIN table1
on
(
    new_condition
)

LEFT JOIN table2
on
(
    condition1
)

LEFT JOIN table3
on
(
    condition2
)

where
(
    main_condition
)

有趣的问题。也许这次我最喜欢自己的问题:)

答案 2 :(得分:0)

你无法在ON子句中创建这个新条件

on子句就在您加入时,但您可以在where子句

中添加此新条件

例如

    where
 (
main_condition
 )
  AND
 (
  new condition 
 )

编辑:

试试这个

 SELECT 'asdf', '123' ...
 FROM (select 'asdf', '123' ... FROM table1 WHERE new_condition ) t
                                                      ^^--your new condition here
 LEFT JOIN table2
 on
 ........

EDIT2:如果您的新情况可能出错,您可以制作if语句

    where
  (
 main_condition
 )
 AND
 (
  if(new condition is something , do something , else do something else) 
 )

EDIT3:

 SELECT 'asdf', '123' ...
 FROM (select 'asdf', '123' ... FROM table1 where main condition
       UNION 
      select 'asdf', '123' ... FROM table1 WHERE new_condition ) t
                                                  ^^--your new condition here
 LEFT JOIN table2
 on
 ........

答案 3 :(得分:0)

您需要在第一次加入的on子句中包含条件:

SELECT 'asdf', '123' ...
FROM table1 LEFT JOIN
     table2
     on condition1 AND new condition LEFT JOIN
     table3
     on condition2
where main_condition

where使用left join子句时要小心。通常,您希望将这些条件移动到on子句中,因为它们可能会无意中撤消左外连接的效果(将其转换为inner join)。

答案 4 :(得分:0)

我最好的猜测是迄今为止的评论。

SELECT 'asdf', '123' ...
FROM table1
FULL OUTER JOIN table2  --NOTE THE FULL OUTER here  all records in table 2 and only those that match in table 1
on
    condition1 AND
    new_condition=True
LEFT JOIN table3
on
(
    condition2
)

where
(
    main_condition
)