【问题标题】:Trying to put a query inside another query in phpMyAdmin试图将查询放在 phpMyAdmin 中的另一个查询中
【发布时间】:2017-08-20 06:20:34
【问题描述】:

我正在尝试将一个查询用作另一个查询的数据源,但我不断收到来自 SELECT 的解析错误。我对 SQL 和 phpmyadmin 还很陌生,不知道为什么会发生这个错误。这是我正在尝试执行的查询:

SELECT  CUS_CODE, 
 COUNT(LINE.INV_NUMBER) AS "Number of Invoices", 
 AVG("Invoice Total") AS "Average Invoice Amount", 
 MAX("Invoice Total") AS "Max Invoice Amount", 
 MIN("Invoice Total") AS "Min Invoice Amount", 
 Sum("Invoice Total") AS "Total Customer Purchases"
FROM    (SELECT CUS_CODE, LINE.INV_NUMBER AS INV_NUMBER,
        Sum(LINE.LINE_UNITS*LINE.LINE_PRICE) AS "Invoice Total"
        FROM    INVOICE, LINE 
        WHERE   INVOICE.INV_NUMBER = LINE.INV_NUMBER
        GROUP BY    CUS_CODE, LINE.INV_NUMBER)
GROUP BY    CUS_CODE;

对不起,如果我的问题不清楚,但我可以回答任何问题以帮助解决问题。

【问题讨论】:

  • 外部查询只能访问由子查询创建的派生表公开的字段。它无权访问数据库的实际表,例如LINE
  • 除此之外,您必须为派生表提供别名。
  • @GiorgosBetsos 我如何为之前的表格提供别名?我试图找到它,但我找不到如何给它起别名。
  • ... GROUP BY CUS_CODE, LINE.INV_NUMBER) AS t ...
  • @GiorgosBetsos 所以我必须使用 AS 进行内部查询?

标签: mysql phpmyadmin


【解决方案1】:

您的查询:

SELECT CUS_CODE,
    COUNT(LINE.INV_NUMBER) AS "Number of Invoices",
    AVG("Invoice Total") AS "Average Invoice Amount",
    MAX("Invoice Total") AS "Max Invoice Amount",
    MIN("Invoice Total") AS "Min Invoice Amount",
    Sum("Invoice Total") AS "Total Customer Purchases"
FROM (
    SELECT CUS_CODE,
        LINE.INV_NUMBER,
        Sum(LINE.LINE_UNITS * LINE.LINE_PRICE) AS "Invoice Total"
    FROM INVOICE,
        LINE
    WHERE INVOICE.INV_NUMBER = LINE.INV_NUMBER
    GROUP BY CUS_CODE, INV_NUMBER
    )
GROUP BY CUS_CODE;

这里有几个问题:

  1. 在您的外部查询中,您引用了LINE.INV_NUMBER,但LINE 表在此上下文中不可用。这是您想要的子查询的INV_NUMBER
  2. 您的子查询缺少别名,因此您无法在外部查询中引用它。这只会抛出一个没有别名的错误。

固定:

SELECT t1.CUS_CODE,
    COUNT(t1.INV_NUMBER) AS "Number of Invoices",
    AVG(t1."Invoice Total") AS "Average Invoice Amount",
    MAX(t1."Invoice Total") AS "Max Invoice Amount",
    MIN(t1."Invoice Total") AS "Min Invoice Amount",
    Sum(t1."Invoice Total") AS "Total Customer Purchases"
FROM (
    SELECT CUS_CODE,
        LINE.INV_NUMBER AS INV_NUMBER,
        Sum(LINE.LINE_UNITS * LINE.LINE_PRICE) AS "Invoice Total"
    FROM INVOICE,
        LINE
    WHERE INVOICE.INV_NUMBER = LINE.INV_NUMBER
    GROUP BY CUS_CODE,
        LINE.INV_NUMBER
    ) as t1
GROUP BY CUS_CODE;

【讨论】:

  • 它似乎仍然不起作用。我仍然收到 SELECT 错误,但我也收到 t1 别名错误。
  • 你能分享一下错误吗?我相信这里的语法是正确的,因此它是特定于您的数据的东西导致了问题,并且确切的错误消息将有助于解决问题。
  • “Previous parsed”警告信息来自 phpmyadmin 和 is a known bug 另一个错误可能是来自 mysql 的错误,它更中肯。
  • 它说在“t1”下找到了一个以前的别名
  • 好的。我只能假设它是子查询中 INV_NUMBER 的多余字段别名。我已经删除了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
相关资源
最近更新 更多