2015-05-15 43 views
2

我的SQL查詢出現問題。我想按債務金額選擇記錄。金額通過與兩個表格的關係計算。嘗試在where子句中使用別名列名時發生錯誤

這工作得很好:

SELECT `i`.*, 
(i.amount_netto + (i.amount_netto * i.vat/100)) - (SUM(p.amount_netto)) AS `debt`, 
`e`.`name` AS `user_name`, 
`e`.`surname` AS `user_surname`, 
`c`.`name` AS `contractor_name` 
FROM `invoices` AS `i` 
INNER JOIN `payments` AS `p` ON i.id = p.invoice_id 
INNER JOIN `employees` AS `e` ON i.employee_id = e.id 
INNER JOIN `contractors` AS `c` ON i.contractor_id = c.id 
GROUP BY `i`.`id` 
ORDER BY `debt` ASC 

但是當我通過debt添加一個WHERE子句,我得到一個錯誤:

Unknown column 'debt' in 'where clause' 

查詢看起來是這樣的:

SELECT `i`.*, 
(i.amount_netto + (i.amount_netto * i.vat/100)) - (SUM(p.amount_netto)) AS `debt`, 
`e`.`name` AS `user_name`, 
`e`.`surname` AS `user_surname`, 
`c`.`name` AS `contractor_name` 
FROM `invoices` AS `i` 
INNER JOIN `payments` AS `p` ON i.id = p.invoice_id 
INNER JOIN `employees` AS `e` ON i.employee_id = e.id 
INNER JOIN `contractors` AS `c` ON i.contractor_id = c.id 
WHERE `debt` > 1 
GROUP BY `i`.`id` 
ORDER BY `debt` ASC 

爲什麼我不能在WHERE子句中訪問debt,但我可以在ORDER子句中使用?

+0

你應該使用表的別名來訪問的債務,也可能是'p.debt'可能或您製作的其他別名。 – iphonic

+0

我試圖使用p.debt並沒有任何反應。我仍然有一個錯誤:「在'where子句'''Unknown column'p.debt'' – dtx

回答

3

debt不是列,但是別名。在執行查詢之前,列(表達式)別名不會被解析,因此它們不能在WHERE子句中使用。

比如這個查詢是不合法:

select foo + 3 as bar 
from baz 
where bar = 39 

,而是你必須重寫WHERE子句中的整個表達式:

select foo + 3 as bar 
from baz 
where foo + 3 = 39 

此外,由於debt實際上是基於在一個聚合上,你不能在WHERE子句中過濾這個。您必須使用HAVING在聚合後評估謂詞。因此,您的查詢應該是:

SELECT ... 
FROM ... 
GROUP BY ... 
HAVING (i.amount_netto + (i.amount_netto * i.vat/100)) - (SUM(p.amount_netto)) > 1 
ORDER BY ... 

注意MySql offers an SQL extension which enables the use of aliases in the HAVING clause,所以你也可以這樣做:

SELECT ... 
FROM ... 
GROUP BY ... 
HAVING debt > 1 
ORDER BY ... 
1

SQL通常不允許您在WHERE,GROUP BY或HAVING子句中引用列別名。 MySQL的支持引用在GROUP BY列別名和HAVING

嘗試改變你在那裏查詢到

WHERE (i.amount_netto + (i.amount_netto * i.vat/100)) - (SUM(p.amount_netto)) > 1 GROUP BY i.id ORDER BY debt ASC 

另一種選擇,你可以使用子查詢

SELECT * from (`i`.*, (i.amount_netto + (i.amount_netto * i.vat/100)) - (SUM(p.amount_netto)) AS `debt`, `e`.`name` AS `user_name`, `e`.`surname` AS `user_surname`, `c`.`name` AS `contractor_name` FROM `invoices` AS `i` INNER JOIN `payments` AS `p` ON i.id = p.invoice_id INNER JOIN `employees` AS `e` ON i.employee_id = e.id INNER JOIN `contractors` AS `c` ON i.contractor_id = c.id GROUP BY `i`.`id`) as newTable 
WHERE `debt` > 1 ORDER BY `debt` ASC 
+0

SELECT'i'。*,(i.amount_netto +(i.amount_netto * i.vat/100)) - (SUM as'as''''''''''''''''''''''''''''''''''''''''''''''''' 'i' INNER JOIN'payments' as'p' ON i.id = p.invoice_id INNER JOIN'employees' as'e' ON i.employee_id = e.id INNER JOIN'contractors' as'c' ON i.contractor_id = c.id WHERE(i.amount_netto +(i.amount_netto * i.vat/100)) - (SUM(p.amount_netto))> 1 GROUP BY i.id ORDER BY debt ASC;我有關於無效使用組功能的錯誤。 – dtx

+0

啊對不起...錯過你在這裏使用分組...嘗試使用由LC提出的解決方案,或者你可以嘗試使用子查詢 –