Псевдоним столбца не распознается в выражении WHERE - PullRequest
4 голосов
/ 23 августа 2010

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

 SELECT 
 ID,
 DistanceFromUtrecht,
 (
  SELECT
   (MAX(DateUntil) - (ReleaseDays * 60 * 60 * 24))
  FROM
   PricePeriod
  WHERE
   PricePeriod.FK_Accommodation = Accommodation.ID
 ) AS LatestBookableTimestamp
FROM
 Accommodation
WHERE
 LatestBookableTimestamp < UNIX_TIMESTAMP()

phpMyAdmin продолжает выдавать ошибку об отсутствии столбца с именем «LatestBookableTimestamp», даже несмотря на то, что у меня есть столбец, полученный подзапросом, этот псевдоним.Я также попробовал выбрать каждый столбец с префиксом таблицы.Это не сработало.Наконец, я выбрал все столбцы по псевдониму таблицы и присвоил таблице псевдоним.Все без удачи.

Может кто-нибудь сказать мне, что я делаю не так?Я даже искал некоторые ресурсы, чтобы проверить, не ошибаюсь ли я, но во многих случаях авторы в Интернете используют тот же синтаксис, что и я.

Ответы [ 4 ]

11 голосов
/ 23 августа 2010

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

HAVING
  LatestBookableTimestamp < UNIX_TIMESTAMP()

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

Попробуйте так:

SELECT 
  a.ID,
  a.DistanceFromUtrecht,
  pp.LatestBookableTimestamp
FROM
  Accommodation AS a
INNER JOIN (
  SELECT
    FK_Accommodation,
    MAX(DateUntil) - (ReleaseDays * 60 * 60 * 24) AS LatestBookableTimestamp
  FROM 
    PricePeriod 
  GROUP BY 
    FK_Accommodation
) AS pp    
ON pp.FK_Accommodation = a.ID    
WHERE
  pp.LatestBookableTimestamp < UNIX_TIMESTAMP()
6 голосов
/ 23 августа 2010

Нельзя использовать псевдоним столбца в предложении WHERE.
MySQL (и SQL Server) позволят использовать псевдоним столбца в GROUP BY, но это не поддерживается широко. ORDER BY является наиболее последовательно поддерживаемым местом, которое поддерживает ссылки на псевдонимы столбцов.

Использование:

   SELECT a.id,
          a.distancefromutrecht,
          b.LatestBookableTimestamp
     FROM ACCOMMODATION a
LEFT JOIN (SELECT pp.fk_accommodation,
                  MAX(DateUntil) - (ReleaseDays * 60 * 60 * 24) AS LatestBookableTimestamp
             FROM PRICEPERIOD pp
         GROUP BY pp.fk_accommodation) b ON b.fk_accommodation = a.id
    WHERE b.LatestBookableTimestamp < UNIX_TIMESTAMP()
1 голос
/ 23 августа 2010
select a.ID, 
    a.DistanceFromUtrecht, MaxDateUntil - (ReleaseDays * 60 * 60 * 24) AS LatestBookableTimestamp 
from (
    SELECT FK_Accommodation, MAX(DateUntil) as MaxDateUntil
    FROM PricePeriod 
    group by FK_Accommodation
) ppm
inner join Accommodation a on ppm.FK_Accommodation = a.ID 
where MaxDateUntil - (ReleaseDays * 60 * 60 * 24) < UNIX_TIMESTAMP() 
1 голос
/ 23 августа 2010

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

select * from (
 SELECT ID, DistanceFromUtrecht, 
 ( 
  SELECT 
   (MAX(DateUntil) - (ReleaseDays * 60 * 60 * 24)) 
  FROM 
   PricePeriod 
  WHERE 
   PricePeriod.FK_Accommodation = Accommodation.ID 
 ) AS LatestBookableTimestamp 
FROM 
 Accommodation 
) a
WHERE 
 LatestBookableTimestamp < UNIX_TIMESTAMP() 
...