Mysql 在计算列(包括子查询)上使用WHERE子句
我无法在计算列上写入条件。我读过几篇关于Stackoverflow的帖子。不幸的是,我仍然无法理解这一点。我有以下MySQL查询:Mysql 在计算列(包括子查询)上使用WHERE子句,mysql,subquery,where-clause,Mysql,Subquery,Where Clause,我无法在计算列上写入条件。我读过几篇关于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_comm
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;
如何在子查询和sum(列别名total)的结果上添加条件
谢谢。在
SELECT
列表中定义的别名不能在WHERE
列表中引用,因为查询的(逻辑)执行顺序是FROM->WHERE->groupby->(HAVING)->SELECT
您可以尝试将和total=3340
替换为使total=3340
这不是标准的SQL,但在MySQL中是允许的(它在执行HAVING
和SELECT
子句的顺序上是灵活的),并且可以避免重复WHERE
子句中的代码
另一种方法是将查询封装在派生表中,并在externalWHERE
子句中提取条件
因此,您的选择是:
- 使用
拥有(MySQL中允许使用技巧):
- 在
选择和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
),因此您还可以使用(无代码重复):
(如果条件是=3340
或除相等以外的任何其他条件,则这当然不起作用。)在选择
列表中定义的别名不能在何处
列表中引用,因为查询的(逻辑)执行顺序是从->何处->分组方式->(have)->SELECT
您可以尝试将和total=3340
替换为使total=3340
这不是标准的SQL,但在MySQL中是允许的(它在执行HAVING
和SELECT
子句的顺序上是灵活的),并且可以避免重复WHERE
子句中的代码
另一种方法是将查询封装在派生表中,并在externalWHERE
子句中提取条件
因此,您的选择是:
- 使用
拥有(MySQL中允许使用技巧):
- 在
选择和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
),因此您还可以使用(无代码重复):
(如果条件是=3340
或除相等以外的任何其他条件,则这当然不起作用。)在选择
列表中定义的别名不能在何处
列表中引用,因为查询的(逻辑)执行顺序是从->何处->分组方式->(have)->SELECT
您可以尝试将和total=3340
替换为使total=3340
这不是标准的SQL,但在MySQL中是允许的(它在执行HAVING
和SELECT
子句的顺序上是灵活的),并且可以避免重复WHERE
子句中的代码
另一种方法是将查询封装在派生表中,并在externalWHERE
子句中提取条件
因此,您的选择是:
- 使用
拥有(MySQL中允许使用技巧):
- 在
选择和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
),因此您还可以使用(无代码重复):
(如果条件是=3340
或除相等以外的任何其他条件,则这当然不起作用。)在选择
列表中定义的别名不能在何处
列表中引用,因为查询的(逻辑)执行顺序是从->何处->分组方式->(have)->SELECT
您可以尝试将和total=3340
替换为使total=3340
这不是标准的SQL,但在MySQL中是允许的(它在执行HAVING
和SELECT
子句的顺序上是灵活的),并且可以避免重复WHERE
子句中的代码
另一种方法是将查询封装在派生表中,并在externalWHERE
子句中提取条件
因此,您的选择是:
- 使用
拥有(MySQL中允许使用技巧):
- 在
选择和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
),因此您还可以使用(无代码重复):
(如果条件是>=3340
或除相等以外的任何其他条件,则这当然不起作用。)