2010-08-23 63 views
4

我的一個創建的查詢有一個奇怪的問題。鑑於一個查詢:列別名在WHERE語句中未被識別

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」,甚至allthough我有一個柱子中,子查詢retreived,該別名。我也試過用tableprefix選擇每一列。這並不奏效。最後,我通過一個表別名選擇了所有的列,然後我給了這個表一個別名。所有沒有運氣。

有人能告訴我我做錯了什麼嗎?我甚至搜索了一些資源,看看我是否沒有弄錯,但在很多情況下,互聯網上的作者使用的語法和我一樣。

+0

見更新答案我已經看到了非depndedent子查詢 – Mchl 2010-08-23 18:26:22

+0

!謝謝! – Ben 2010-08-23 18:33:34

回答

10

使用具有

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

感謝您的留言;呃,我應該如何創建一個非依賴的子查詢? – Ben 2010-08-23 18:22:29

+0

感謝一羣Mchl!我試過更新後的查詢,這比使用HAVING時快了近4倍。 + 1 +答案! – Ben 2010-08-23 18:30:39

5

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

謝謝,我沒有意識到這一點。在我看到的資源中沒有WHERE和HAVING包含在查詢中,所以我沒有看到這個;)+ 1 – Ben 2010-08-23 18:25:36

+0

+1,因爲我曾嘗試在我的where子句中使用列別名,並且它打破了我的查詢,並提供UNIX_TIMESTAMP()函數 – 2016-08-22 14:36:27

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

通過使用HAVING而不是WHERE它的工作。你的解決方案是否更好?還是使用HAVING更好? – Ben 2010-08-23 18:24:35

+0

使用HAVING可能會更好。 – Fosco 2010-08-23 18:26:59

+0

好的,謝謝,無論如何+ 1! – Ben 2010-08-23 18:29:46

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

感謝您的回答。 Mchl已經提供了一個工作查詢。 + 1爲您的時間和精力:) – Ben 2010-08-23 18:31:06