[英]MySQL using Inner joins on an alias of a calculated column
我有這樣的查詢:
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只是一個簡單的占位符,因為計算要復雜得多。
您正嘗試在ON
子句中使用列別名。 MySQL文檔有關於這種情況的說法:
與
ON
使用的conditional_expr是可以在WHERE子句中使用的表單的任何條件表達式。
而且 :
標准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
為了避免在查詢中進行三次計算,可以將外部計算包裝在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
這里,計算只進行了兩次而不是三次。
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
您不能在查詢中使用派生值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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.