代码之家  ›  专栏  ›  技术社区  ›  Ben

WHERE语句中无法识别列别名

  •  4
  • Ben  · 技术社区  · 15 年前

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

     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选择每一列。这不管用。最后,我用一个表别名选择了所有的列,并给了这个表一个别名。都没有运气。

    4 回复  |  直到 14 年前
        1
  •  11
  •   Mchl    15 年前

    使用HAVING

    HAVING
      LatestBookableTimestamp < UNIX_TIMESTAMP()
    

    另一方面,您使用的是dependednt子查询,这在性能方面是个坏主意。

    试着这样做:

    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()
    
        2
  •  6
  •   OMG Ponies    15 年前

    不能在WHERE子句中使用列别名。
    MySQL(和sqlserver)将允许在groupby中使用列别名,但并不广泛支持。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()
    
        3
  •  1
  •   Fosco    15 年前

    您需要接受原始查询,而不使用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() 
    
        4
  •  1
  •   D'Arcy Rittich    15 年前
    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()