Mysql 尝试在where子句中使用别名列名时出错
我的SQL查询有问题。我想按债务金额选择记录。金额根据与两个表的关系计算 这很好: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`
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
AScontractor\u name
FROMinvoices
ASi
internal JOINpayments
ASpON i.id=p.invoice\u id-internal JOINeON i.employee\u id=e.idcontractors
ASON.id=c.id=c.id(i.amount_netto+(i.amount_netto*i.vat/100))-(SUM(p.amount_netto))>1按债务ASC的i.id订单分组;我有一个关于无效使用分组函数的错误。啊,对不起…错过了您在这里使用分组的机会…尝试使用lc提出的解决方案,或者您可以尝试使用子查询