Почему нельзя использовать переменные в предложении where mysql

Используя Mysql, этот оператор работает:

SELECT *, ABS(UNIX_TIMESTAMP(time) - 
       UNIX_TIMESTAMP('2013-11-14 14:35:21') ) as diff from Alert
order by diff
limit 3

Но если я добавлю предложение where следующим образом, это даст ошибку «Неизвестный столбец« diff »в« предложении where »»

SELECT *, ABS(UNIX_TIMESTAMP(time) - 
       UNIX_TIMESTAMP('2013-11-14 14:35:21') ) as diff from Alert
where diff < 2
order by diff
limit 3

Хорошо, я изменяю оператор на использование предложения Have следующим образом:

SELECT *, ABS(UNIX_TIMESTAMP(time) - 
       UNIX_TIMESTAMP('2013-11-14 14:35:21') ) as diff from Alert
order by diff
having diff<2

Это все еще дает мне У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, на предмет правильного синтаксиса для использования рядом с «имея diff‹2» в строке 4.


person user3098791    schedule 13.12.2013    source источник


Ответы (2)


Вы не можете использовать псевдоним в предложении where, но порядок по нему работает, потому что порядок по происходит после того, как запрос извлекает полный результат.

Ваш третий запрос дает ошибку, потому что я думаю, что правильный синтаксис сначала имеет порядок,

SELECT *, ABS(UNIX_TIMESTAMP(time) - UNIX_TIMESTAMP('2013-11-14 14:35:21') ) as diff 
from Alert having diff<2 order by diff 

Еще немного деталей

WHERE is used while listing and no ALIAS names are available yet

HAVING filters rows after listing all possible rows so ALIAS names are generated
person A Paul    schedule 13.12.2013

Использовать

SELECT *, ABS(UNIX_TIMESTAMP(time) - UNIX_TIMESTAMP('2013-11-14 14:35:21') ) as diff 
from Alert 
order by 
    ABS(UNIX_TIMESTAMP(time) - UNIX_TIMESTAMP('2013-11-14 14:35:21') ) 
limit 3

Вы не можете использовать вычисление именованного столбца в предложении order by (или where).

person craigmj    schedule 13.12.2013