子查询使用IN mysql错误代码:1054

时间:2017-10-09 02:09:52

标签: mysql sql

我实际上是在尝试重写一个查询,以便将SUM(金额)计算为子查询,数据库名为“sakila”:

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

3 个答案:

答案 0 :(得分: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必须为{em> customer表的每一行运行单独的查询。你的第一个查询可能就是这里的方法,因为它允许像索引和其他优化这样的东西。

答案 1 :(得分: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;

答案 2 :(得分: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子句中引用的表(或视图或子查询)中的列。