为什么表的顺序在自联接中很重要

时间:2014-01-12 06:56:57

标签: sql join inner-join

这是我的表格和查询作为小提琴。这会产生正确的结果,或者我正在寻找的结果。在这个查询中,m1首先出现,然后是m2,正如你在行中所看到的那样......#microposts m1 inner join microposts m2 ..."

SELECT *
FROM microposts m1
INNER JOIN microposts m2
ON m1.ancestry = m2.id AND m2.user_id=1 AND m1.user_id=2

http://sqlfiddle.com/#!2/ec0c88/3

现在,如果您切换m1和m2(即" ...微博m2内部连接微博m3 ...",则返回'原始帖子'(微博是回复帖子的祖先')。

select *
from microposts m2
inner join microposts m1
on m1.ancestry = m2.id and m2.user_id=1 and m1.user_id=2

http://sqlfiddle.com/#!2/ec0c88/2

在我的应用程序中,一切正常,我只是想更好地理解自连接。因为我将它们概念化的方式,我不会期望这些结果。

感谢您向我介绍SQLFiddle。这很酷。

2 个答案:

答案 0 :(得分:2)

因为它们是不同的查询。 首先是:

m2.user_id=105

,第二个:

m2.user_id=1 and m1.user_id=105

显然结果不同。

答案 1 :(得分:0)

原因是您使用了SELECT *。因此,m1m2的列名相同。但是在结果集中只返回每对同名列中的一对,哪一个取决于别名在查询中出现的顺序。

我更改了查询,为每个表的列提供了不同的别名,现在交换顺序时结果相同:

SELECT m1.id AS id1, m1.content as content1, m1.ancestry AS ancestry1, m1.user_id as userid1,
       m2.id AS id2, m2.content as content2, m2.ancestry AS ancestry2, m2.user_id as userid2
FROM microposts m2
INNER JOIN microposts m1
ON m1.ancestry = m2.id AND m2.user_id=1 AND m1.user_id=2

请参阅http://sqlfiddle.com/#!2/ec0c88/10http://sqlfiddle.com/#!2/ec0c88/11