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

标签 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_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 中是允许的(它在 HAVINGSELECT 子句的执行顺序上是灵活的)并且可以避免重复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 ;
    
  • SELECTWHERE 子句中的重复代码:

    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/

相关文章:

mysql select * from table group by id 汇总

php - 检索 mysql 数据

php - 具有多个子查询的 MySQL 查询,每个子查询具有不同的连接类型

php - 模型中 1 个函数中的多个 MySQL 查询

php - Aqua Data Studio UTF-8 支持 ('é' 显示为 'é' )

MySQL乘法子查询结果

sql - 在其他谓词(Oracle 分析函数)之前评估分析函数上的 WHERE 谓词

mysql - SQL Where 子句中的 If/Else

sql - 根据别名列名进行过滤

mysql - 如何保持交易的动态余额并获取交易后的金额