ВЫБРАТЬ результат в пределах выбора не достижим? - PullRequest
0 голосов
/ 02 июля 2019

У меня есть следующий запрос в базе данных MySQL:

SELECT o.*,
  (select IFNULL(sum(units_purchased),0) from member_purchase mp where 
    mp.offer_id = o.id and mp.is_deleted = 0) as sold_units
  FROM offer o 
  where o.partner_uid in ('941e08b6-f801-4656-8906-0a309b88c429') 
  and o.order_from < '2019-07-01' and o.order_to > '2019-07-10' and sold_units < o.servings and o.is_deleted = 0;

Если я удалю

sold_units

... т работает нормально, но когда я оставляю это, там написано:

Неизвестный столбец "sold_units" в предложении where

Кто-нибудь знает, что вызывает это>?

Ответы [ 3 ]

2 голосов
/ 02 июля 2019

На псевдонимы столбцов нельзя ссылаться в предложении WHERE. Это определение языка SQL и верно для всех баз данных.

Типичные решения - использовать подзапрос, CTE или боковое соединение.

В MySQL есть другой обходной путь. Это позволяет использовать предложение HAVING в неагрегированном запросе. Итак, вы можете использовать:

select o.*,
       (select coalesce(sum(units_purchased), 0) 
        from member_purchase mp
        where mp.offer_id = o.id and
              mp.is_deleted = 0
       ) as sold_units
from offer o
where o.partner_uid in ('941e08b6-f801-4656-8906-0a309b88c429') and
      o.order_from < '2019-07-01' and 
      o.order_to > '2019-07-10' and
      o.is_deleted = 0
having sold_units < o.servings;
1 голос
/ 02 июля 2019

использовать подзапрос

select * from 
(
  SELECT o.*,
  (select IFNULL(sum(units_purchased),0) from member_purchase mp where 
    mp.offer_id = o.id and mp.is_deleted = 0) as sold_units
  FROM offer o 
  where o.partner_uid in ('941e08b6-f801-4656-8906-0a309b88c429') 
  and o.order_from < '2019-07-01' and o.order_to > '2019-07-10'
)A where sold_units < servings and is_deleted = 0;
0 голосов
/ 02 июля 2019

Хорошо, согласно предложению @Raymond, я получил следующее:

SELECT * FROM (SELECT o.*,
(select IFNULL(sum(units_purchased),0) from member_purchase mp where mp.offer_id = o.id and mp.is_deleted = 0) as sold_units
FROM offer o where o.partner_uid in ('941e08b6-f801-4656-8906-0a309b88c429') and o.order_from < '2019-07-02 10:00:00' and o.order_to > '2019-07-02 10:00:00' and o.is_deleted = 0) as results where results.sold_units < results.servings;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...