4

我创建的一个查询有一个奇怪的“问题”。给定下一个查询:

 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

4 回答 4

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()
于 2010-08-23T18:20:07.657 回答
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()
于 2010-08-23T18:19:49.533 回答
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() 
于 2010-08-23T18:19:56.063 回答
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() 
于 2010-08-23T18:27:11.653 回答