2013-09-22 70 views
1

我有這樣的查詢:的MySQL試圖重新使用子查詢的結果,以高效的方式

SELECT q,COUNT(x),y, 
    (SELECT i FROM (SELECT q,w FROM tableA WHERE conds) 
    JOIN tableC ON (cond) 
    WHERE id = t.q) 
FROM (SELECT q,w FROM tableA WHERE conds) t 
JOIN tableB 
GROUP BY q 

子查詢(SELECT q,w FROM tableA WHERE conds)返回幾百行。在GROUP BY q之後還剩下大約20行。

子查詢(SELECT i FROM (SELECT q,w FROM tableA WHERE conds) join tableC WHERE id = t.q)在其內部使用與上面的子查詢完全相同的子查詢,但隨後還會選擇當前正在分組的值的一小部分。

我的問題似乎是這樣的。性能太慢,因爲我似乎無法將WHERE id = t.q放在(SELECT q,w, FROM Table A WHERE conds)子查詢中。我只能猜測,對於每個唯一值q,查詢正在運行,它會產生數百行,然後必須在未索引的臨時表上執行WHERE子句。我想我需要在完全加入之前執行WHERE

有什麼想法嗎?

+1

上http://sqlfiddle.com/測試用例將是非常有益 – Laurence

+0

您的查詢是無效的,在'SELECT'列表子查詢應該只返回一個列,你在做'(選擇I ,j ...)' – rsanchez

+0

非常正確。做了一個編輯。 – user1063998

回答

0

此查詢可能會產生相同的結果,但這個問題中缺少的信息太多,誰可以確定?

Select 
    q, 
    count(x), 
    y, 
    i 
From 
    tableA a 
     inner join 
    tableC c 
     on cond and c.id = a.q 
     cross join -- is this an inner join? 
    tableB b 
Where 
    conds 
Group By 
    q, 
    y, 
    i