Чи можете ви використовувати псевдонім у пункті WHERE у mysql?


121

Мені потрібно використовувати псевдонім у пункті WHERE, але він постійно повідомляє мені, що це невідомий стовпець. Чи є спосіб обійти це питання? Мені потрібно вибрати записи, рейтинг яких перевищує х. Рейтинг обчислюється як наступний псевдонім:

sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating

Відповіді:


229

Ви можете використовувати пункт HAVING, який може бачити псевдоніми, наприклад

 HAVING avg_rating>5

але в пункті де вам потрібно буде повторити свій вираз, наприклад

 WHERE (sum(reviews.rev_rating)/count(reviews.rev_id))>5

АЛЕ! Не всі вирази будуть дозволені - використання функції агрегування типу SUM не буде працювати, і в цьому випадку вам потрібно буде використовувати пункт HAVING.

З посібника з MySQL :

Не можна посилатися на псевдонім стовпця в пункті WHERE, оскільки значення стовпця ще не може бути визначене при виконанні пропозиції WHERE. Див. Розділ B.1.5.4, «Проблеми з псевдонімом стовпців» .


1
Якщо я повторюю вираз, він говорить мені: "недійсне використання групової функції"

3
Переробили, щоб зробити чіткішими функції агрегування заборонені
Пол Діксон

Гарне пояснення, особливо. частина "але в пункті де ... повторити .." частина
th3an0maly

4
Це хороша відповідь, але, будь ласка, врахуйте наслідки для продуктивності, оскільки вони HAVINGвиконуються після отримання даних та WHEREвиконання раніше.
StockB

Ви не можете використовувати функції сукупності в пункті WHERE. Стаття WHERE фільтрує лише рядки по одному, а не цілі групи.
Білл Карвін

33

Не знаю, якщо це працює в mysql, але використовуючи sqlserver, ви також можете просто перетворити його так:

select * from (
  -- your original query
  select .. sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating 
  from ...) Foo
where Foo.avg_rating ...

6

Це питання досить старе, і одна відповідь вже набрала 160 голосів ...

Все-таки я б сказав це ясно: Питання насправді не в тому, чи можна використовувати псевдонімові імена в WHEREпункті.

sum(reviews.rev_rating) / count(reviews.rev_id) as avg_rating

є агрегацією. У WHEREпункті ми обмежуємо записи, які ми хочемо з таблиць, переглядаючи їх значення. sum(reviews.rev_rating)і count(reviews.rev_id), однак, не є значеннями, які ми знаходимо в записі; вони є значеннями, які ми отримуємо лише після агрегації записів.

Так що WHEREнедоречно. Нам потрібно HAVING, як ми хочемо обмежити рядки результатів після агрегації. Не може бути

WHERE avg_rating > 10

ні

WHERE sum(reviews.rev_rating) / count(reviews.rev_id) > 10

звідси

HAVING sum(reviews.rev_rating) / count(reviews.rev_id) > 10

з іншого боку, це можливо і відповідає стандарту SQL. Тоді як

HAVING avg_rating > 10

можливий лише в MySQL. Він не є дійсним SQL відповідно до стандарту, оскільки цей SELECTпункт повинен бути виконаний після HAVING. З документів MySQL:

Інше розширення MySQL до стандартного SQL дозволяє посилатися в пункті HAVING на псевдонімові вирази у списку вибору.

Розширення MySQL дозволяє використовувати псевдонім у пункті HAVING для зведеного стовпця

https://dev.mysql.com/doc/refman/5.7/uk/group-by-handling.html


0

Якщо ваш запит є статичним, ви можете визначити його як перегляд, тоді ви можете використовувати цей псевдонім у пункті де під час запиту на представлення.


0
SELECT * FROM (SELECT customer_Id AS 'custId', gender, age FROM customer
    WHERE  gender = 'F') AS c
WHERE c.custId = 100;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.