2017-10-09 57 views
1

我基本上是試圖重寫查詢使SUM(量)計算爲子查詢,與數據庫名爲「sakila的」:使用子查詢在MySQL錯誤代碼:1054

SELECT first_name, last_name, SUM(amount) AS totalSpent 
FROM sakila.customer c JOIN 
    sakila.payment p 
    ON c.customer_id = p.customer_id 
GROUP BY last_name, first_name; 

我有什麼是:

SELECT first_name, last_name, SUM(amount) AS totalSpent FROM sakila.customer c WHERE c.customer_id IN (SELECT customer_id FROM sakila.payment p) GROUP BY last_name, first_name;

然而,當我嘗試運行它,它說,錯誤代碼1054,未知列 '金額' 在 '字段列表'

EER Diagram

+0

您在表客戶中沒有列'amount'。檢查你的表格結構。 – RubahMalam

回答

4

這是你當前的查詢,這我倒認爲是去這裏的路:

SELECT 
    first_name, 
    last_name, 
    SUM(amount) AS totalSpent 
FROM sakila.customer c 
INNER JOIN sakila.payment p 
    ON c.customer_id = p.customer_id 
GROUP BY 
    first_name, 
    last_name; 

這是一個相當精簡查詢,因爲你正在做一個簡單的聚集聯接。如果你想計算的金額作爲子查詢,你可以通過在payment表中的相關子查詢做到這一點:

SELECT 
    first_name, 
    last_name, 
    SELECT(SUM(amount) FROM sakila.payment p 
      WHERE p.customer_id = c.customer_id) AS totalSpent 
FROM sakila.customer c; 

注意這個查詢有多少成本最高,因爲在SELECT語句子查詢相關到外部查詢。這意味着MySQL將不得不針對customer表的每行運行單獨的查詢。你的第一個查詢可能是這裏的方法,因爲它可以允許索引和其他優化。

0

首先,你所遇到的amount error,因爲你沒有指定它來自哪個源來自所以我檢查什麼是您預期的結果,並想出了這個:

SELECT c.first_name, c.last_name, SUM(p.amount) AS totalSpent 
FROM sakila.customer c 
    INNER JOIN payment p ON p.customer_id = c.customer_id 
GROUP BY c.last_name, c.first_name; 
0

另一種方法是使用相關子查詢:

SELECT c.first_name, c.last_name, 
     (SELECT SUM(p.amount) 
     FROM sakila.payment p 
     WHERE p.customer_id = c.customer_id 
     ) AS totalSpent 
FROM sakila.customer c; 

這將聚合保存在外部查詢中。並且它可以利用payment(customer_id, amount)的性能指數。

請注意,您的查詢不起作用,因爲您只能引用FROM子句中引用的表(或視圖或子查詢)中的列。

+0

非常感謝!這使得更多的意義! – Victoria