你如何在mysql中结合内部和外部连接

Posted

技术标签:

【中文标题】你如何在mysql中结合内部和外部连接【英文标题】:How do you combine an inner and outer join in mysql 【发布时间】:2010-09-30 05:06:52 【问题描述】:

我可以在 sybase 中完成,我可以在 oracle 中完成,但我没有看到如何在 mysql 中完成。

我有这个: (请克制自己重新格式化我的sql,上次有人这样做他们改变了它,所以它不一样并且使问题变得毫无意义)

select table1.id
from
table1
  inner join
    table2 on (table1.id = table2.id and table2.data='cat'),
table1 t1
  left outer join
    table3 on (t1.id = table3.id and table3.data = 'dog')

我得到了各种毫无意义的结果。

我想从 table1 where table2.data = cat 中获取所有 id 的列表,然后对 table3.data = dog 的表 3 的结果进行外连接。

我注意到我不能在两个连接子句中为 table1 指定相同的表/别名,这让我相信 mysql 正在单独运行连接表达式并将结果组合在一起或类似的东西。

我还尝试摆脱 from 部分中的“内部连接”并将其放在 where 子句中,这也不起作用,尽管它没有以不同的方式工作(得到不同的错误结果)

这在 sybase 或 oracle 中非常容易。

我做错了什么?

【问题讨论】:

【参考方案1】:
select table1.id
from
table1
  inner join
    table2 on (table1.id = table2.id and table2.data='cat')
  left outer join
    table3 on (table1.id = table3.id and table3.data = 'dog')

我认为您永远不想在 from 语句中使用逗号。我相信逗号相当于说交叉连接。虽然不确定,但我认为这个查询就是您要查找的内容。

【讨论】:

使用逗号语法,通常可以通过在 WHERE 子句中放置条件来防止它成为交叉连接。 更正您不想在同一个查询中混合使用逗号语法 (SQL-89) 和 JOIN 语法 (SQL-92)。尽管解析器允许这样做,但它可能会导致混淆交互,因为逗号的优先级低于 JOIN。 有趣的看待它的方式,但是,是的,我认为逗号相当于交叉连接,正如比尔所说,然后在 WHERE 子句中被适当的连接条件取消。逗号形式大大早于 JOIN 符号。 (而且很好发现,肖恩!)

以上是关于你如何在mysql中结合内部和外部连接的主要内容,如果未能解决你的问题,请参考以下文章

如何在python-opengl中连接'内部立方体'和“外部立方体”(4维对象)的顶点?

如何使用内部/外部组合在 Access 中加入 4 个以上的表?

cmd 中连接mysql时报'mysql'不是内部或外部命令,也不是可运行的程序或批处理文件,该怎么办?

如果外部 ADO 连接已连接或断开,如何检测组件内部?

mysql之临时表

如何在docker容器中连接外部mysql服务器