这是我的表格和查询作为小提琴。这会产生正确的结果,或者我正在寻找的结果。在这个查询中,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。这很酷。
答案 0 :(得分:2)
因为它们是不同的查询。 首先是:
m2.user_id=105
,第二个:
m2.user_id=1 and m1.user_id=105
显然结果不同。
答案 1 :(得分:0)
原因是您使用了SELECT *
。因此,m1
和m2
的列名相同。但是在结果集中只返回每对同名列中的一对,哪一个取决于别名在查询中出现的顺序。
我更改了查询,为每个表的列提供了不同的别名,现在交换顺序时结果相同:
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/10和http://sqlfiddle.com/#!2/ec0c88/11