如何在MySQL的WHERE子句中使用子查询表别名

如何在MySQL的WHERE子句中使用子查询表别名,mysql,subquery,Mysql,Subquery,当我尝试使用TEMP_表时,发生了一个错误,并且说TEMP_表不存在。为什么不起作用?我认为执行顺序是“FROM”,然后是“WHERE”,此时已经创建了表别名。您不能在子查询中为先前计算的别名计算max,或者您可以将查询重写为 SELECT invoice_id, sum_amount FROM (SELECT invoice_id, SUM(amount) AS sum_amount FROM invoice GROUP BY invoice_id) AS TEMP_T

当我尝试使用TEMP_表时,发生了一个错误,并且说TEMP_表不存在。为什么不起作用?我认为执行顺序是“FROM”,然后是“WHERE”,此时已经创建了表别名。

您不能在子查询中为先前计算的别名计算max,或者您可以将查询重写为

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); 
我创建了一个用于测试的示例演示

样本数据

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
在上面的查询中,您可以看到发票的最大金额总和为10,因此发票_id=>1,2应返回1,发票_id=>2(5+5=10)的两个条目也为10,结果集样本输出中不应包括3和4

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

谢谢。有没有链接可以解释为什么不能使用别名?@llian我找不到任何最好的链接可以发送给你,但别名计算别名可以用于筛选,但不能用于再次计算。你需要放入整个查询,或者必须使用子选择。我知道还有其他方法可以做到这一点。但是有什么解释为什么这个无效呢?谢谢您需要一个CTE(公共表表达式)来重用派生表别名,而mysql不支持CTE。
invoice_id  sum_amount  max_amount
1           10          10
2           10          10