2011-08-01 20 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」之後的文檔中。