我无法在计算列上写入条件。我读过几篇关于 Stackoverflow 的文章。不幸的是,我仍然无法弄清楚。我有以下 MySQL 查询:
SELECT
c.pk_tbl_commodity, c.s_name, c.s_default_variant,
p.pk_tbl_parameter, p.s_name_parameter,
((SELECT SUM(p2.n_price_parameter) from tbl_Parameter p2
WHERE p2.fk_tbl_commodity = p.fk_tbl_commodity
AND p2.b_default = 1
AND p2.s_name_parameter <> p.s_name_parameter GROUP BY NULL) + c.n_price_without_dph + p.n_price_parameter) as total
FROM tbl_Commodity c JOIN tbl_Parameter p on (p.fk_tbl_commodity = c.pk_tbl_commodity)
WHERE s_name like '%acti%'
AND b_bin = '0'
AND total = 3340
ORDER BY s_name, s_default_variant;
我得到了错误:
[Err] 1054 - Unknown column 'total' in 'where clause'
如何在子查询和求和(列别名 total)的结果上添加条件?
谢谢。
最佳答案
在 SELECT
列表中定义的别名不能在 WHERE
列表中引用,因为查询的(逻辑)执行顺序是 FROM -> WHERE -> GROUP BY -> (HAVING) -> SELECT
。
您可以尝试将 AND total = 3340
替换为 HAVING total = 3340
。
这不是标准的 SQL 但它在 MySQL 中是允许的(它在 HAVING
和 SELECT
子句的执行顺序上是灵活的)并且可以避免重复WHERE
子句中的代码。
另一种方法是将查询封装在派生表中,并在外部 WHERE
子句中提取条件。
所以你的选择是:
使用
HAVING
(MySQL 允许的技巧):SELECT c.pk_tbl_commodity, c.s_name, c.s_default_variant, p.pk_tbl_parameter, p.s_name_parameter, (... long and complex subquery ...) AS total FROM tbl_Commodity c JOIN tbl_Parameter p on (p.fk_tbl_commodity = c.pk_tbl_commodity) WHERE s_name like '%acti%' AND b_bin = '0' HAVING total = 3340 ORDER BY s_name, s_default_variant ;
SELECT
和WHERE
子句中的重复代码:SELECT c.pk_tbl_commodity, c.s_name, c.s_default_variant, p.pk_tbl_parameter, p.s_name_parameter, (... long and complex subquery ...) AS total FROM tbl_Commodity c JOIN tbl_Parameter p on (p.fk_tbl_commodity = c.pk_tbl_commodity) WHERE s_name like '%acti%' AND b_bin = '0' AND (... long and complex subquery ...) = 3340 ORDER BY s_name, s_default_variant ;
封装在派生表中:
SELECT * FROM ( SELECT c.pk_tbl_commodity, c.s_name, c.s_default_variant, p.pk_tbl_parameter, p.s_name_parameter, (... long and complex subquery ...) AS total FROM tbl_Commodity c JOIN tbl_Parameter p on (p.fk_tbl_commodity = c.pk_tbl_commodity) WHERE s_name like '%acti%' AND b_bin = '0' ) AS dt WHERE total = 3340 ORDER BY s_name, s_default_variant ;
由于
total
列将有一个常量结果 (3340
),您还可以使用(无重复代码):SELECT c.pk_tbl_commodity, c.s_name, c.s_default_variant, p.pk_tbl_parameter, p.s_name_parameter, 3340 AS total FROM tbl_Commodity c JOIN tbl_Parameter p on (p.fk_tbl_commodity = c.pk_tbl_commodity) WHERE s_name like '%acti%' AND b_bin = '0' AND (... long and complex subquery ...) = 3340 ORDER BY s_name, s_default_variant ;
(如果条件是 >= 3340
或除相等之外的任何其他条件,那当然不会起作用。)
关于mysql - 在计算列(包括子查询)上使用 WHERE 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21752961/