Mysql-左连接所有表

Mysql-左连接所有表,mysql,sql,join,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 ) .. .. 但这是行不通的。

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

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

LEFT JOIN table2
on
(
    condition1
)

LEFT JOIN table3
on
(
    condition2
)

where
(
    main_condition
)
现在的问题是,我还需要有条件地包括
table1
。我试过这个:

..
..
FROM table1
on
(
    new_condition
)
..
..
但这是行不通的。请帮忙


编辑(新发现): 在本文()中,我发现了以下代码:

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’

我确信这与我正在尝试做的事情没有直接关系,但是有可能像这样将表连接到双表吗?

你不能在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
 ........
编辑2:如果你的新情况可能是错误的,你可以做一个假设

    where
  (
 main_condition
 )
 AND
 (
  if(new condition is something , do something , else do something else) 
 )
编辑3:

 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
 ........

你不能在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
 ........
编辑2:如果你的新情况可能是错误的,你可以做一个假设

    where
  (
 main_condition
 )
 AND
 (
  if(new condition is something , do something , else do something else) 
 )
编辑3:

 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
 ........

虚拟表:

首先从虚拟表中选择一条记录
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
)
完全(外部)连接

另一种不同的解决方案是使用
完全联接
完全外部联接
,这类似于
左联接
右联接
的组合。这是完全不同的,尽管您可以获得非常相似的结果:

select
  *
from
  table1
  full outer join table2 on joincondition.

在上面的查询中,两个表中的所有记录都将返回,即使两个表中都不存在匹配的记录。

伪表:

首先从虚拟表中选择一条记录
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
)
完全(外部)连接

另一种不同的解决方案是使用
完全联接
完全外部联接
,这类似于
左联接
右联接
的组合。这是完全不同的,尽管您可以获得非常相似的结果:

select
  *
from
  table1
  full outer join table2 on joincondition.

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

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

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

当使用带有左连接的
where
子句时,要小心。通常,您希望将这些条件移动到
on
子句中,因为它们可能会无意中撤消左侧外部联接(将其变成
内部联接
)的效果。

对于第一个联接,您需要在
on
子句中包含该条件:

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

当使用带有左连接的
where
子句时,要小心。通常,您希望将这些条件移动到
on
子句中,因为它们可能会无意中撤消左侧外部联接的效果(将其变成
内部联接)。

感谢您对讨论的贡献。我找到了答案。其实很简单:

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
)

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

谢谢你对讨论的贡献。我找到了答案。其实很简单:

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
)

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

到目前为止我最好的猜测和评论

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
)

我的最佳猜测与评论迄今为止

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
)

您的意思是使用
,其中table1.foo=?
?如果表1是可选的,那么它不应该位于左联接操作的左侧。也许只有我,但我不知道您在寻求什么帮助。您的主选择有一个from table1 left join table2,条件是它本质上包括表1中的所有记录,并且只包括表2中匹配的记录。根据“on”子句,您已经包括了表1中的所有记录。你是说你只想要表1记录的一个子集?如果是这样,where子句或ON标准可以进一步限制它。。。示例数据/和预期结果将对我有所帮助。@xQbert实际上是这样的:我只想在
new\u condition
为true时从表1中选择行,但如果
new\u condition
为false,您还想从其他表中选择行吗?然后我觉得你不想要一个
左加入
。。。看,把它放在where子句中。在联接中不需要它,因为首先要包括表1中的所有记录。因此,本质上,您是从t1返回所有内容,其中t1.new_condition=True,并包括T2和t3中的所有匹配的RECRD,这取决于on子句是否连接回t1或通过T2。您的意思是使用
其中table1.foo=?
?如果表1是可选的,那么它不应该位于左联接操作的左侧。也许只有我,但我不知道您在寻求什么帮助。您的主选择有一个from table1 left join table2,条件是它本质上包括表1中的所有记录,并且只包括表2中匹配的记录。根据“on”子句,您已经包括了表1中的所有记录。你是说你只想要表1记录的一个子集?如果是这样,where子句或ON标准可以进一步限制它。。。示例数据/和预期结果将对我有所帮助。@xQbert实际上是这样的:我只想在
new\u condition
为true时从表1中选择行,但如果
new\u condition
为false,您还想从其他表中选择行吗?然后我觉得你不想要一个
左加入
。。。看,把它放在where子句中。在联接中不需要它,因为首先要包括表1中的所有记录。所以本质上,你是从t1返回所有内容,其中t1.new_condition=True,包括T2和t3中的所有匹配的recrd,这取决于