Mysql 尝试在where子句中使用别名列名时出错

Mysql 尝试在where子句中使用别名列名时出错,mysql,Mysql,我的SQL查询有问题。我想按债务金额选择记录。金额根据与两个表的关系计算 这很好: 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`

我的SQL查询有问题。我想按债务金额选择记录。金额根据与两个表的关系计算

这很好:

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子句中访问?

SQL通常不允许您在WHERE、GROUP BY或HAVING子句中引用列别名。MySQL确实支持通过引用组中的列别名并具有

尝试将where查询更改为

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

债务
不是列,而是别名。列(表达式)别名在执行查询后才会解析,因此它们不能在WHERE子句中使用

例如,此查询不合法:

select foo + 3 as bar
from baz
where bar = 39
相反,您必须重写WHERE子句中的整个表达式:

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

此外,由于
债务
实际上是基于聚合的,因此不能在WHERE子句中对其进行筛选。相反,您必须在聚合后使用have来计算谓词。因此,您的查询应该是:

SELECT ...
FROM ...
GROUP BY ...
HAVING (i.amount_netto + (i.amount_netto * i.vat / 100)) - (SUM(p.amount_netto)) > 1
ORDER BY ...
请注意,因此您还可以执行以下操作:

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

您应该使用表别名访问债务,它可以是
p.debt
或您使用的其他别名。我尝试使用p.debt,但没有任何反应。我仍然有一个错误:“where子句”中的未知列“p.debt”选择
i
*,(i.amount\u netto+(i.amount\u netto*i.vat/100))-(SUM(p.amount\u netto))作为
债务
e
名称
作为
用户名
e
作为
姓氏,
c
name
AS
contractor\u name
FROM
invoices
AS
i
internal JOIN
payments
AS
p
ON i.id=p.invoice\u id-internal JOIN
e
ON i.employee\u id=e.id
contractors
AS
ON.id=c.id=c.id(i.amount_netto+(i.amount_netto*i.vat/100))-(SUM(p.amount_netto))>1按债务ASC的i.id订单分组;我有一个关于无效使用分组函数的错误。啊,对不起…错过了您在这里使用分组的机会…尝试使用lc提出的解决方案,或者您可以尝试使用子查询