示例:
SELECT s.title, t.description,
u1.value * s.cache_value as Cache,
u2.value * s.drive_value as Drive,
u3.value * s.error_value as Error,
u3.value * s.error_value + u3.value * s.error_value as ErrorHigh,
u3.value * s.error_value - u3.value * s.error_value as ErrorLow,
m.area
FROM storage s
JOIN status t on t.id = s.status_id
JOIN manufac m on m.id = s.area
JOIN unit u1 on s.cache_unit_id = u1.id
JOIN unit u2 on s.drive_unit_id = u2.id
JOIN unit u3 on s.error_unit_id = u3.id
期望的目标:
SELECT s.title, t.description,
u1.value * s.cache_value as Cache,
u2.value * s.drive_value as Drive,
u3.value * s.error_value as Error,
u3.value * s.error_value + u3.value * s.error_value as ErrorHigh,
u3.value * s.error_value - u3.value * s.error_value as ErrorLow,
m.area
FROM storage s
JOIN status t on t.id = s.status_id
JOIN manufac m on m.id = s.area
JOIN unit u1 on s.cache_unit_id = u1.id
JOIN unit u2 on s.drive_unit_id = u2.id
JOIN unit u3 on s.error_unit_id = u3.id
WHERE 123 BETWEEN ErrorHigh AND ErrorLow;
MySQL返回语法错误未知列ErrorHigh
注意:ErrorHigh
和'ErrorLow`是我创建的用于显示计算值的新列
答案 0 :(得分:4)
1054错误是因为SQL不支持在WHERE子句中引用列别名 - 最早的MySQL支持是GROUP BY
。但是大多数其他数据库仅支持ORDER BY
子句中的列别名。
如果要继续使用列别名,则表示的操作需要在子选择派生表/内联视图中执行。否则,您可以将列别名替换为它所代表的操作 - 如下所示:
WHERE 123 BETWEEN u3.value * s.error_value + u3.value * s.error_value
AND u3.value * s.error_value - u3.value * s.error_value