mysql - 为什么 MySQL 对于明确定义的列显示 Unknown column?

标签 mysql sql

我正在构建一个 SQL 查询以生成一张已接受或延迟关闭的工单表。

SELECT 
    svc_guid,
    svc_priority,
    cast(svc_minsinqueue AS SIGNED)-(pri_svc_accept_hours * 60) AS accept_overdue,
    cast(svc_minselapsed AS SIGNED)-(pri_svc_close_hours * 60) AS closure_overdue
FROM
    svcrequest
LEFT JOIN 
    priorities
ON 
    pri_id=svc_priority
WHERE
    accept_overdue > 0 OR
    closure_overdue > 0
ORDER BY 
    accept_overdue DESC;

结果是:

#1054 - Unknown column 'accept_overdue' in 'where clause' 

与 WHERE 1 相同的精确查询不会产生错误。 (即使使用 ORDER BY accept_overdue DESC)

最佳答案

不能在where子句中使用列名别名
where 子句在 select 子句之前计算,因此数据库引擎无法知道此列别名 要构建正确的查询,您必须复制相关的列代码

SELECT 
    svc_guid,
    svc_priority,
    cast(svc_minsinqueue AS SIGNED)-(pri_svc_accept_hours * 60) AS accept_overdue,
    cast(svc_minselapsed AS SIGNED)-(pri_svc_close_hours * 60) AS closure_overdue
FROM
    svcrequest
LEFT JOIN 
    priorities
ON 
    pri_id=svc_priority
WHERE
    cast(svc_minsinqueue AS SIGNED)-(pri_svc_accept_hours * 60)  > 0 OR
    cast(svc_minselapsed AS SIGNED)-(pri_svc_close_hours * 60) > 0
ORDER BY 
accept_overdue DESC;

如您所见,ORDER BY 子句将事实评估为最后一个 .. 可以使用列别名

关于mysql - 为什么 MySQL 对于明确定义的列显示 Unknown column?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57206781/

相关文章:

MySQL GROUP BY 通过空间搜索在三个表中运行缓慢

mysql - 如何在查询中使用变量

mysql - "Arithmetic operation resulted in an overflow."转换为 Azure 项目后在 ASP.Net 中出现此错误

mysql - 为什么 MySQL 允许没有聚合函数的 "group by"查询?

mysql插入两个相同的表,没有主键

php - 忽略特定的 WHERE 标准

批量插入期间的 SQL Server 表锁定

sql - 如何通过db.query在sqlite中使用BETWEEN

sql - 为一行分配一个从 1 到 X 的数字然后循环 - 在 SQL 中

mysql - SQL 选择父项作为列名,子项作为值