2011-08-01 21 views
1
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行肯定。他们都这样做。MySQL的说法是不工作

sub =查询的目的是找出已支付多少发票。例如,对于具有1000.00的“总计”列的发票,可以具有2或3个拆分支付。我最终想要做的是先列出所有未付发票或部分发票。但在我进入ORDER BY阶段之前,我需要弄清楚这个错误。

+0

哪个i.id在抱怨?难道它会对“i.id AS id”感到困惑吗?也许尝试改变别名到别的东西,看看是否有效。 – Marvo

回答

0

你可以试试吗?

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 
+0

没有做外出的事情,但将JOIN声明的位置移到“FROM invoices i”之后,它运行良好。 – jeffkee

0

我想你可能会遇到问题,因为你的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 
+1

在'invoices i'后面删除逗号:-) –

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,位于“Join Processing Changes in MySQL 5.0.12”之后的文档中。