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,这取决于