2014-01-08 67 views
1

我嘗試這樣做:mysql howto訪問另一個子查詢中子查詢生成的臨時表?

SELECT ProductId AS GmId, (
    SELECT SUM(Amount) FROM tmp WHERE ProductId=GmId AND (AssignDate BETWEEN '$Date1' AND '$Date2') 
) AS sum0, (
    SELECT SUM(Amount) FROM tmp WHERE ProductId=GmId AND (AssignDate BETWEEN '$Date2' AND '$Date3') 
) AS sum1 FROM (
    SELECT * FROM somerealtable 
) tmp GROUP BY ProductId 

然而MySQL顯示錯誤消息table <database name>.tmp doesn't exist!

如何使這項工作?

編輯:sqlfiddle樣品here

EDIT2:更復雜sqlfiddle sample

+0

考慮提供適當的DDL(和/或sqlfiddle)連同SET – Strawberry

+0

臨時表所需的結果,但在你的問題中未示出(所以他們在哪裏?),是每個會話,並且不能跨會話訪問,以便語句'TEMPORARY表只對當前連接可見「 – nrathaus

+0

http://sqlfiddle.com/#!2/8b5ea/2 –

回答

1

沒有必要使用子查詢。喲可以做同樣的事情JOIN

試試這個:

SELECT a.ProductId AS GmId, 
     SUM(IF(b.AssignDate BETWEEN '$Date1' AND '$Date2', b.Amount, 0)) AS sum0, 
     SUM(IF(b.AssignDate BETWEEN '$Date2' AND '$Date3', b.Amount, 0)) AS sum1 
FROM somerealtable a 
LEFT JOIN tmp b ON a.ProductId=b.GmId 
GROUP BY ProductId 
+0

'SUM(IF(b.AssignDate BETWEEN'$ Date1'AND'$ Date2',b.Amount,0))' - 這是一個不錯的竅門。不知道'如果'能做到這一點。按預期顯示結果。謝謝。 –

+0

@ user1724911非常歡迎... –