2014-01-14 41 views
1

這有點令人困惑,所以請耐心等待。MySQL 5.5中混合連接查詢問題雖然在MySQL 4.1.25中工作

我有3個表:

p   ps   s 
+----+  +----+----+ +----+ 
|id |  |pid |sid | |id | 
+----+  +----+----+ +----+ 
|1 |  |2 |1 | |1 | 
|2 |  |2 |2 | |2 | 
|3 |  |3 |1 | |3 | 
+----+  +----+----+ +----+ 

TBL PS是用來從對記錄鏈接爲s - p可以與多於一個的「記錄,因此鏈接表進行組合。

在MySQL 4.1.25,我用下面的查詢檢索所有數據,包括在「P」沒有必須對應的「S」記錄,即使「P」都沒有聯繫:

select p.id, ps.pid, ps.sid, s.id from p left join ps on p.id=ps.pid s right join on ps.sid=s.id; 

這工作得很好,並正確地返回:

+------+------+------+------+ 
|p.id |ps.pid|ps.sid|s.id | 
+------+------+------+------+ 
|1  |null |null |1  | 
|1  |null |null |2  | 
|1  |null |null |3  | 
|2  |1  |1  |1  | 
|2  |2  |2  |2  | 
|2  |null |null |3  | 
|3  |3  |1  |1  | 
|3  |null |null |2  | 
|3  |null |null |3  | 
+------+------+------+------+  

然而現在,在MySQL 5.5相同的查詢是生產這樣的:

+------+------+------+------+ 
|p.id |ps.pid|ps.sid|s.id | 
+------+------+------+------+ 
|null |null |null |1  | 
|null |null |null |2  | 
|null |null |null |3  | 
|2  |1  |1  |1  | 
|2  |2  |2  |2  | 
|null |null |null |3  | 
|3  |3  |1  |1  | 
|null |null |null |2  | 
|null |null |null |3  | 
+------+------+------+------+  

正如你所看到的,任何不出現在ps中的'p'記錄都會返回一個空值。它幾乎看起來好像它可能有利於正確的加入一切。

有關這裏發生了什麼變化以及如何糾正它的任何想法?

不幸的是,更正後的查詢必須在兩個版本的MySQL中都能正常工作 - 這對我來說越來越難以忍受,但我無能爲力。 顯然,效率是關鍵,因爲這些表包含100個記錄(ps包含1000個記錄),我需要儘可能在一些步驟中獲得相同的結果集。

感謝您的時間夥伴!

回答

1

我想你想要做的這個查詢最好表示:

select p.id, ps.pid, ps.sid, s.id 
from p cross join 
    s left join 
    ps 
    on p.id=ps.pid s and ps.sid=s.id; 

我懷疑MySQL的早期版本被打破。

+0

謝謝!!!在兩個版本上都有魅力,我從來沒有見過「交叉連接」,所以我不得不查看它,但這個查詢第一次解決了我的問題。 Mucho讚賞! – ConBran