2015-05-03 74 views
1
SELECT invoice_id, sum_amount 
FROM (SELECT invoice_id, SUM(amount) AS sum_amount 
     FROM invoice 
     GROUP BY invoice_id) AS TEMP_TABLE 
WHERE sum_amount in (SELECT MAX(sum_amount) 
        FROM TEMP_TABLE); 

當我嘗試使用TEMP_TABLE時,發生錯誤並且表示TEMP_TABLE不存在。爲什麼它不起作用?我認爲執行順序是「FROM」,然後是「WHERE」,那時表的別名已經創建。如何在MySQL的WHERE子句中使用子查詢表別名

+0

我知道有其他的方法來做到這一點。但任何解釋爲什麼這個是無效的?謝謝! – niu

+0

您需要一個CTE(公用表表達式)來重用派生表別名,而mysql不支持CTE。 – piotrm

回答

2

不能計算最大的子查詢先前計算的別名,或者你可以重寫查詢爲

SELECT a.invoice_id, SUM(a.amount) AS sum_amount, 
c.max_amount 
FROM invoice AS a 
CROSS JOIN (
     SELECT MAX(sum_amount) max_amount FROM(
      SELECT invoice_id, SUM(amount) AS sum_amount 
      FROM invoice 
      GROUP BY invoice_id 
    ) b 
) c 
GROUP BY a.invoice_id 
HAVING sum_amount = c.max_amount 

我已經創建了一個示例演示用於測試目的

的樣本數據

INSERT INTO invoice 
    (`invoice_id`, `amount`) 
VALUES 
    (1, 10), 
    (2, 5), 
    (2, 5), 
    (3, 1), 
    (4, 2); 

在上面的查詢中,您可以看到發票金額的最大金額爲10,因此應返回invoice_id => 1,2 1的金額爲10,invoice_id有兩個條目=> 2(5 + 5 = 10)也是10,圖3和4不應該被包括在結果集中的樣本輸出

invoice_id sum_amount max_amount 
1   10   10 
2   10   10 

DEMO

+0

謝謝。解釋爲什麼不能使用別名的任何鏈接? – niu

+0

@llian我找不到任何最好的鏈接發送給你,但別名計算的別名可以用於過濾器,但不能再次計算或者你需要把整個查詢,或者你必須使用子選擇 –