在WHERE子句中使用AS字段

时间:2017-12-17 15:18:30

标签: mysql mysql5

在以下示例中:

SELECT op.product_id, op.name, IF(op.sku <> '', op.sku, op.model) AS op_sku,
SUM(op.quantity) AS quantity
FROM order_product op GROUP BY op_sku ORDER BY op_sku ASC LIMIT 0,50

如何在WHERE子句中使用op_sku?我是否需要添加另一个选择才能获得我需要的值?

编辑原始查询:

SELECT op.product_id, 
       op.name, 
       IF(op.sku <> '', op.sku, op.model) AS model, 
       SUM(op.quantity)                   AS quantity,
       op.sku
FROM   `oc_product` p 
       RIGHT JOIN `oc_order_product` op 
               ON ( p.product_id = op.product_id ) 
       LEFT JOIN `oc_order` o 
              ON ( op.order_id = o.order_id ) 
WHERE  o.order_status_id IN( 17 ) 
GROUP  BY op.sku 
ORDER  BY op.sku ASC 
LIMIT  0, 50 

2 个答案:

答案 0 :(得分:3)

您不能在同一查询的SELECT子句中使用WHERE子句中定义的别名,因为在评估WHERE子句时它尚不可用。一种选择是重复IF表达式:

SELECT
    op.product_id,
    op.name,
    IF(op.sku <> '', op.sku, op.model) AS op_sku,
    SUM(op.quantity) AS quantity
FROM order_product op
WHERE IF(op.sku <> '', op.sku, op.model) = <some_value>
GROUP BY op_sku
ORDER BY op_sku
LIMIT 0,50

处理此问题的另一个常见选项是只包装当前查询,然后从中进行选择。在这种情况下,别名将可用:

SELECT *
FROM
(
    SELECT
        op.product_id,
        op.name,
        IF(op.sku <> '', op.sku, op.model) AS op_sku,
        SUM(op.quantity) AS quantity
    FROM order_product op
    GROUP BY op_sku
) t
WHERE t.op_sku = <some_value>
ORDER BY op_sku
LIMIT 0, 50

作为其他人的一般性评论,如果您在按op_sku分组时选择非聚合列,则查询可能会出现问题。理想情况下,其他列应该在功能上依赖于op_sku ,它们应该包含在聚合函数中。但是,尽管基础查询存在同样的问题,但我给出的一般答案应该不会有效。

答案 1 :(得分:2)

您不能在where子句中使用自定义别名,但可以通过having子句访问这些​​别名

SELECT op.product_id, op.name, IF(op.sku <> '', op.sku, op.model) AS op_sku,
SUM(op.quantity) AS quantity
FROM order_product op
GROUP BY op_sku 
HAVING op_sku  = @somevalue
ORDER BY op_sku ASC 
LIMIT 0,50

您的查询无效,而在较新的版本5.7中,它会通过您的错误,因为选择列表中的product_id和名称无效,无论是在分组中添加这些还是对它们应用一些聚合函数来获取它们的值