используя поле AS в предложении WHERE

0

В следующем примере:

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 
Теги:
mysql5

2 ответа

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. В идеале, либо другие столбцы должны быть функционально зависимыми от op_sku либо они должны быть объединены в совокупные функции. Но общий ответ, который я дал, должен быть не менее достоверным, несмотря на те же проблемы с базовым запросом.

  • 1
    Я бы просто добавил, что Common Table Expressions появятся в следующей версии MySQL, что создаст больше возможностей для обработки этого.
  • 0
    @BrianDewhirst Да, и я также слышал, что будут доступны некоторые основные аналитические функции. Я надеюсь, что мне не нужно редактировать все мои ответы MySQL.
Показать ещё 3 комментария
2

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню