Mysql 在计算列(包括子查询)上使用WHERE子句

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

我无法在计算列上写入条件。我读过几篇关于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;
如何在子查询和sum(列别名total)的结果上添加条件


谢谢。

SELECT
列表中定义的别名不能在
WHERE
列表中引用,因为查询的(逻辑)执行顺序是
FROM->WHERE->groupby->(HAVING)->SELECT

您可以尝试将
和total=3340
替换为
使total=3340

这不是标准的SQL,但在MySQL中是允许的(它在执行
HAVING
SELECT
子句的顺序上是灵活的),并且可以避免重复
WHERE
子句中的代码

另一种方法是将查询封装在派生表中,并在external
WHERE
子句中提取条件

因此,您的选择是:

  • 使用
    拥有
    (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
子句中的代码

另一种方法是将查询封装在派生表中,并在external
WHERE
子句中提取条件

因此,您的选择是:

  • 使用
    拥有
    (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
子句中的代码

另一种方法是将查询封装在派生表中,并在external
WHERE
子句中提取条件

因此,您的选择是:

  • 使用
    拥有
    (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
子句中的代码

另一种方法是将查询封装在派生表中,并在external
WHERE
子句中提取条件

因此,您的选择是:

  • 使用
    拥有
    (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
或除相等以外的任何其他条件,则这当然不起作用。)