В следующем примере:
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
Как я могу использовать op_sku
в разделе WHERE? Нужно ли мне добавить другой вариант, чтобы получить нужное значение?
ИЗМЕНИТЬ исходный запрос:
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
Вы не можете использовать псевдоним, определенный в предложении 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
. В идеале, либо другие столбцы должны быть функционально зависимыми от 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 и имя в списке выбора недействительны либо добавляют их в группу, либо применяют к ним некоторую агрегированную функцию, чтобы получить их значения