2017-10-09 61 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