在更換所使用的慢得令人難以置信嵌套的選擇,我已經結束了一個查詢,看起來像這樣一些舊代碼的過程的一部分:MySQL的涉及多個瘋狂自連接
SELECT r3.r_id AS r3_id, r2.r_id AS r2_id, r1.r_id AS r1_id
FROM
table_r r3
LEFT JOIN (
table_r r2
INNER JOIN (
table_r r1
INNER JOIN table_d d ON r1.r_id = d.r_id
) ON r2.r_id = r1.parent_id
) ON r3.r_id = r2.r_id
WHERE d.d_id = 3
所以在最裏面的連接,我正在查找table_r
(複製r1
)中與table_d
的記錄子集有關係的記錄。
在的table_r
(r2
)的第二個副本的下一個加入的時候,我正在尋找的記錄,其主要指數(r_id
)與從以往的記錄父指數(parent_id
)加入。
然後我試圖做一個LEFT JOIN
與table_r
(r3
)第三個副本,只是比前加入r_id
匹配r_id
。這個最外連接的想法是獲得來自table_r
的所有記錄,但是通過使用進一步條件(尚未在我的查詢中)來確定NULLs
中的哪些記錄具有NULLs
對於r2_id
來選擇相當於NOT IN
。
問題是LEFT JOIN
沒有給我整個table_r
。它給了我沒有最後加入的記錄的相同子集 - 換句話說,與INNER JOIN
一樣。所以,而我期待1208分的記錄,我得到508
我知道我必須做一些扭曲這裏...
在清晰度進一步的嘗試: 我要的是: (全table_r的)減去(在table_r記錄這是在table_r的其他記錄子記錄其鏈接到一組在table_d記錄) – 2010-09-01 15:44:27