2012-07-27 89 views
5

我有一個查詢,像這樣:MySQL的內部採用的計算列的別名加入

SELECT User.id, 10*10 as distance 
FROM USERS 
INNER JOIN 
(
    SELECT Location.user_id, 
    min(10 * 10) as mindistance 
    FROM Location 
    GROUP BY Location.user_id 
) L ON Users.id = Location.user_id AND distance = L.mindistance 

如果我離開它是,我不斷收到:

Unknown column 'distance' in 'on clause' 

但如果我把User.distance而不是正確的距離,我得到:

MySQL syntax error near.... 

我可以不使用別名'這種方式計算字段? 10 * 10只是一個簡單的佔位符,因爲計算要複雜得多。

+0

可能的重複[在MySQL查詢的WHERE子句中使用列別名會產生錯誤](http://stackoverflow.com/questions/942571/using-column-alias-in-where-clause-of-mysql-query-produces -an-error) – Joni 2012-07-27 09:59:06

回答

0
SELECT User.id, 10*10 as distance 
FROM USERS 
INNER JOIN 
( 
    SELECT Location.user_id, 
    min(10 * 10) as mindistance 
    FROM Location 
    GROUP BY Location.user_id 
) L ON User.id = Location.user_id AND L.mindistance =10*10 
0

不能在查詢中使用派生值where子句 - 其中用於限制記錄和要使用的索引 - 優化程序不能使用派生值,因此您需要篩選最終結果。

不太清楚你在做什麼,但你可以試試:

SELECT User.id, 10*10 as distance 
FROM USERS 
INNER JOIN 
( 
    SELECT Location.user_id, 
    min(10 * 10) as mindistance 
    FROM Location 
    GROUP BY Location.user_id 
) L ON User.id = Location.user 
HAVING USERS.distance = L.mindistance 
5

爲了避免使計算三次查詢,你可以用外計算在FROM子查詢,這將給你訪問的別名字段名(它是不是在你的原始查詢訪問):

SELECT a.* 
FROM 
(
    SELECT id, 10*10 AS distance 
    FROM USERS 
) a 
INNER JOIN 
(
    SELECT user_id, 
    MIN(10 * 10) AS mindistance 
    FROM Location 
    GROUP BY user_id 
) L ON a.id = L.user_id AND a.distance = L.mindistance 

這裏,計算僅做了三件,而不是兩次。

10

您正試圖在ON子句中使用列別名。該MySQL documentation具有這樣說這種情況:

conditional_exprON使用是可以WHERE子句中使用的形式的任何條件表達式。

And also

標準SQL不允許在WHERE子句中的列別名引用。這種限制是強加的,因爲當WHERE子句被評估時,列值可能還沒有被確定。例如,下面的查詢是非法的:

這就是說,你可以使用變量來計算表達式的ON子句中,然後在列列表中使用的值,就像這樣:

SELECT User.id, @dist as distance 
FROM USERS 
INNER JOIN 
(
    SELECT Location.user_id, 
    min(10 * 10) as mindistance 
    FROM Location 
    GROUP BY Location.user_id 
) L ON Users.id = Location.user_id AND (@dist := 10*10) = L.mindistance 
+0

作者的SQL中沒有WHERE子句。 – 2016-05-12 23:18:20

+1

修復@JohnFactorial – Joni 2016-05-13 10:08:38