在Where子句中使用为字段



在以下示例中:

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 

您不能使用同一查询的WHERE子句中SELECT子句中定义的别名,因为在评估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 ,它们应包裹在聚合功能中。但是我给出的一般答案尽管与基础查询存在同样的问题,也应该是同样有效的。

您不能在子句中使用自定义别名,但是可以通过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 and name in select列表中的名称是无效的,要么通过组中添加这些函数,要么在它们上应用一些聚合功能以获取其值

相关内容

  • 没有找到相关文章

最新更新