在WHERE语句中无法识别列别名

时间:2010-08-23 18:17:55

标签: sql mysql database column-alias

我对我创建的一个查询有一个奇怪的'问题'。给出下一个查询:

 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”的列的错误,即使我有一个列,由一个子查询检索,该别名。我也尝试过用tableprefix选择每一列。这不起作用。最后,我通过table-alias选择了所有列,并为表提供了别名。一切都没有运气。

有人可以告诉我我做错了什么吗?我甚至搜索了一些资源,看看我是不是错了,但在很多情况下,互联网上的作者使用与我相同的语法。

4 个答案:

答案 0 :(得分:11)

使用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()

答案 1 :(得分:6)

您不能在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()

答案 2 :(得分:1)

您需要在不使用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() 

答案 3 :(得分:1)

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()