Вложенные запросы и Unknown column in WHERE clause

275
29 сентября 2017, 16:52

Есть два SQL-запроса. Первый выполняется без проблем:

SELECT DISTINCT self.*, 
    (SELECT COUNT(*) FROM `ps_orders` 
        WHERE self.`id_customer` != 'NULL' 
            AND `id_customer` = self.`id_customer`) AS orders_total 
    FROM `ps_module_actionssubscription` AS self 
    LIMIT 0,20;

А на второй запрос MySQL ругается Error Code: 1054. Unknown column 'orders_total' in 'where clause':

SELECT DISTINCT self.*, 
    (SELECT COUNT(*) FROM `ps_orders` 
        WHERE self.`id_customer` != 'NULL' 
            AND `id_customer` = self.`id_customer`) AS orders_total 
    FROM `ps_module_actionssubscription` AS self 
    WHERE orders_total > 5 
    LIMIT 0,20;

Где ошибка во втором запросе?? Как правильно его записать, чтобы он возвращал только результаты по условию WHERE??

Answer 1

В документации en/ru написано:

It is not allowable to refer to a column alias in a WHERE clause, because the column value might not yet be determined when the WHERE clause is executed. See Section B.1.5.4, “Problems with Column Aliases”.

тобишь

Псевдонимы столбцов нельзя использовать в выражении WHERE, поскольку находящиеся в столбцах величины на момент выполнения WHERE могут быть еще не определены. See section A.5.4 Проблемы с alias.

Вместе с этим

выражение HAVING может ссылаться на любой столбец или псевдоним, упомянутый в выражении select_expression. HAVING отрабатывается последним, непосредственно перед отсылкой данных клиенту, и без какой бы то ни было оптимизации.

и

Псевдонимы можно использовать для ссылки на столбец в GROUP BY, ORDER BY или в части HAVING, а также для лучшего именования столбцов

Получается для псевдонимов в данном случае следует применять HAVING вместо WHERE.

P.S. Для небольшого ознакомления предлагаю ознакомиться с вопросом на enSO WHERE vs HAVING

READ ALSO
MySQL - связать поле таблицы с другим полем этой же таблицы

MySQL - связать поле таблицы с другим полем этой же таблицы

Есть БД, в ней Primary key это поле name (varchar 255)И есть поле main (varchar 255)

290
Переопределение метода, Override

Переопределение метода, Override

Надо искать пересечения множествУ каждого класса есть метод добавляющий элемент, метод выводящий содержание класса на экран

220
Не учитывать первую часть из split

Не учитывать первую часть из split

У меня есть массив емейлов, мне нужно из них вытащить только доменыКак с помощью метода split не учитывать или удалить строку, которая идет до знака...

232
Как правильно считать элементы из файла в массив java

Как правильно считать элементы из файла в массив java

Как правильно считать элементы из файла в массивИ что бы потом этот массив можно было передавать другим методам, например для сортировки

394