2012-10-01 37 views
2

,所以我有這個疑問有效地使用或LEFT聲明加入

SELECT * FROM b 
    LEFT JOIN n ON b.id = n.id 
    LEFT JOIN nr ON (b.pid <> 0 AND b.pid = nr.vid) 
     OR (b.pid = 0 AND n.vid = nr.vid) 

但是,一個EXPLAIN對查詢語句就會發現,爲了執行或加入,它需要通過所有條目搜索在nr表中,即使nr.vid是該表的主鍵,並且在b.pid和n.vid上有索引。

有關如何使其更高效的任何建議?

解釋結果

1, 'SIMPLE', 'b', 'ref', 'PRIMARY,r_rID', 'r_rID', '197', 'const,const', 48, 'Using where; Using temporary; Using filesort' 
1, 'SIMPLE', 'n', 'eq_ref', 'PRIMARY,nst,nnc,ut,uid', 'PRIMARY', '4', 'b.nid', 1, 'Using where' 
1, 'SIMPLE', 'nr', 'ALL', '', '', '', '', 335654, '' 
1, 'SIMPLE', 'tn', 'ref', 'nid', 'nid', '4', 'n.nid', 1, '' 
+0

請顯示解釋此查詢的結果。 – defuz

+0

您可以改用'UNION'。 –

回答

2

我不知道,但它可能是有用的:

SELECT * FROM b 
    LEFT JOIN n ON b.id = n.id 
    LEFT JOIN nr as nr1 ON b.pid <> 0 AND b.pid = nr1.vid  
    LEFT JOIN nr as nr2 ON b.pid = 0 AND n.vid = nr2.vid 

也許,MySQL不能明白,你的表情互相排斥。從理論上講,這個查詢應該和你的一樣。