簡體   English   中英

MySQL在計算列的別名上使用內部聯接

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM