2013-04-09 26 views
0

我想加入三個表,然後將它們聯合起來。兩個連接的表在兩個聯合查詢中是相同的,並且這樣連接兩次似乎是一種浪費。見下面的例子。這最好的表現如何?由於有效地結合兩個查詢都有一個共同的內部聯接

SELECT t1.c1,t2.c1,t3.c1 
FROM audits AS t1 
INNER JOIN t2 ON t2.t1_id=t1.id 
INNER JOIN t3 ON t3.t1_id=t1.id 
WHERE t2.fk1=123 
UNION 
SELECT t1.c1,t2.c1,t4.c1 
FROM audits AS t1 
INNER JOIN t2 ON t2.t1_id=t1.id 
INNER JOIN t4 ON t4.t1_id=t1.id 
WHERE t2.fk1=123 
ORDER BY t1.fk1 ASC 
+0

這種解決方案很好 – zerkms 2013-04-09 23:34:19

+0

@zerkms是的,它的工作原理,但你做兩次相同的查詢。它可以做一次子查詢嗎?在同一個t1/t2內部聯接中對T3和T4使用外部聯接將起作用,但不會單獨提供記錄。 – user1032531 2013-04-09 23:52:27

+0

我同意@zerkms。如果你關心性能,考慮使用[觀點](http://dev.mysql.com/doc/refman/5.6/en/views.html)(; – 2013-04-09 23:55:13

回答

0

這會工作,如果語法MySQL支持的,並且可能會略微高效:

SELECT t1.c1, t2.c1, t.c1 
FROM audits AS t1 
INNER JOIN t2 ON t2.t1_id=t1.id 
INNER JOIN (
    select t1_id from t3 
    union 
    select t1_id from t4 
) as t ON t.t1_id=t1.id 
WHERE t2.fk1=123 
ORDER BY t1.fk1 ASC 

原因一pssible性能提升的關係是聯盟的小足跡「編;一列而不是3. UNION消除重複(不像UNION ALL),因此必須對整個記錄集進行排序以消除重複。

在元級查詢中,此查詢通知優化器有特定的優化可用,它可能無法自行確定。

+0

「可能會稍微更有效率」---如果只有這個子查詢得到了很好的優化。正如我們都知道的(?) - mysql優化子查詢並不像我們想要的那樣理想。 – zerkms 2013-04-10 04:16:53

+0

@zerkms:見我的附錄。這不是子查詢是否優化;這是優化程序是否會看到對原始查詢執行相同的優化。 – 2013-04-10 04:22:53

+0

@PieterGeerkens請看看[這裏](http://pastie.org/7489957)。它可能更有效,因爲它在連接表* t3 *和* t *之前過濾* t2 *。那麼你的想法呢? – 2013-04-13 13:28:28