在以下示例中:
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列表中的名称是无效的,要么通过组中添加这些函数,要么在它们上应用一些聚合功能以获取其值