我对我创建的一个查询有一个奇怪的'问题'。给出下一个查询:
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选择了所有列,并为表提供了别名。一切都没有运气。
有人可以告诉我我做错了什么吗?我甚至搜索了一些资源,看看我是不是错了,但在很多情况下,互联网上的作者使用与我相同的语法。
答案 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()