【问题标题】:MySQL statement that combines a sub-query and a JOIN is not working结合子查询和 JOIN 的 MySQL 语句不起作用
【发布时间】:2011-08-01 20:41:28
【问题描述】:
SELECT i.id AS id, i.modify_date as modify_date, s.subscription as subscriptionid, p.paid/i.total AS paidratio 
    FROM invoices i,
         (SELECT p.invoice, sum(amount) AS paid FROM payments p GROUP BY p.invoice) p
        LEFT JOIN sub_to_inv s 
            ON i.id=s.invoice
    WHERE p.invoice=i.id 
        AND i.corporation='3' 
        AND i.payer=1

我得到的错误是“i.id 上的未知列”,这完全是伪造的 - 发票 (i) 肯定有一个 id 行。他们都这样做。

sub=query 的目的是查明已支付的发票金额。例如,对于“总计”列为 1000.00 的发票,可能有 2 或 3 次拆分付款。我最终要做的是首先列出所有未付发票或部分发票。但在我进入 ORDER BY 阶段之前,我需要弄清楚这个错误。

【问题讨论】:

  • 它在抱怨哪个 i.id?会不会对“i.id AS id”感到困惑?也许尝试将该别名更改为其他名称,看看是否可行。

标签: mysql join subquery


【解决方案1】:

对所有连接使用JOIN 语法。不要将JOIN 语法与逗号样式的 SQL-89 语法混用。

SELECT ...
FROM invoices i
  INNER JOIN (SELECT...) p
    ON p.invoice=i.id
  LEFT OUTER JOIN sub_to_inv s 
    ON i.id=s.invoice
WHERE 
    AND i.corporation='3' 
    AND i.payer=1

解释:JOIN 的优先级高于逗号连接。所以p JOIN s 在查询评估连接到i 之前被评估。因此,在子句ON i.id=s.invoice 中,i 表尚不为人所知,是无效引用。

请参阅http://dev.mysql.com/doc/refman/5.1/en/join.html,在“MySQL 5.0.12 中的加入处理更改”之后的文档中。

【讨论】:

    【解决方案2】:

    你可以试试这个吗?

    SELECT i.id AS id, i.modify_date as modify_date, s.subscription as subscriptionid, p.paid/i.total AS paidratio 
        FROM invoices i
            LEFT JOIN
              (SELECT p.invoice, sum(amount) AS paid FROM payments p GROUP BY p.invoice) p
              ON p.invoice=i.id 
            LEFT JOIN sub_to_inv s 
                ON i.id=s.invoice
        WHERE  i.corporation='3' 
            AND i.payer=1
    

    【讨论】:

    • 没有做exadt的事情,而是将JOIN语句的位置移到“FROM invoices i”之后,效果很好。
    【解决方案3】:

    我认为您可能会因为 SQL 中的表连接顺序而遇到问题。您是否尝试过使用内部连接。也许试试:

    SELECT 
      i.id AS id, 
      i.modify_date as modify_date, 
      s.subscription as subscriptionid, 
      p.paid/i.total AS paidratio 
    FROM
      invoices i
    INNER JOIN
      (SELECT 
        p.invoice,
        sum(amount) AS paid
      FROM
        payments p
      GROUP BY
        p.invoice) p
    ON
      p.invoice=i.id
    LEFT JOIN
      sub_to_inv s
    ON
      i.id=s.invoice
    WHERE
      i.corporation='3' AND i.payer=1
    

    【讨论】:

    • 去掉invoices i后面的逗号:-)
    猜你喜欢
    • 2017-08-24
    • 2014-11-19
    • 1970-01-01
    • 2021-09-29
    • 2012-12-08
    • 1970-01-01
    • 2017-01-16
    • 2020-05-05
    • 1970-01-01
    相关资源
    最近更新 更多