4

作成したクエリの 1 つに奇妙な「問題」があります。次のクエリが与えられた場合:

 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 に答える