你如何在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 个以上的表?