2010-09-01 71 views
0

在更換所使用的慢得令人難以置信嵌套的選擇,我已經結束了一個查詢,看起來像這樣一些舊代碼的過程的一部分: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_rr2)的第二個副本的下一個加入的時候,我正在尋找的記錄,其主要指數(r_id)與從以往的記錄父指數(parent_id)加入。

然後我試圖做一個LEFT JOINtable_rr3)第三個副本,只是比前加入r_id匹配r_id。這個最外連接的想法是獲得來自table_r的所有記錄,但是通過使用進一步條件(尚未在我的查詢中)來確定NULLs中的哪些記錄具有NULLs對於r2_id來選擇相當於NOT IN

問題是LEFT JOIN沒有給我整個table_r。它給了我沒有最後加入的記錄的相同子集 - 換句話說,與INNER JOIN一樣。所以,而我期待1208分的記錄,我得到508

我知道我必須做一些扭曲這裏...

+0

在清晰度進一步的嘗試: 我要的是: (全table_r的)減去(在table_r記錄這是在table_r的其他記錄子記錄其鏈接到一組在table_d記錄) – 2010-09-01 15:44:27

回答

0

會發生什麼,如果你試試這個?

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 AND d.d_id = 3 
) ON r2.r_id = r1.parent_id 
) ON r3.r_id = r2.r_id 

我所做的是將d.d_id = 3從where子句移至INNER JOINs ON限定符。