2014-01-12 68 views
1

這是我的表和查詢作爲小提琴。這會產生正確的結果或我正在查找的結果。在這個查詢中,M1是第一位的,然後平方米,你可以在該行看到「......微柱M1內加入微柱平方米......」爲什麼在自聯接中表的順序很重要

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(即「......微柱平方米內加入微柱立方米......」,在‘原帖’返回(在誰微柱是‘回覆後’的祖先)。

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。它太酷了。

+1

你的第二個查詢有一個額外的'm2.user_id = 1'檢查。所以他們不相同。 – Barmar

+0

您在兩條SQL語句(user_id)中有不同的條件。 –

+0

順便說一下,'ON'子句應該只包含與兩個表相關的條件。單表條件應該在'WHERE'子句中(除了某些外連接的情況外)。 – Barmar

回答

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

+0

這正是我正在尋找的解釋!非常感謝! – johnklawlor

2

因爲它們是不同的查詢。 首先有:

m2.user_id=105 

和第二有:

m2.user_id=1 and m1.user_id=105 

顯然,結果是不同的。

相關問題