11

我有一个这样的查询:

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 只是一个简单的占位符,因为计算要复杂得多。

4

4 回答 4

14

您正在尝试在ON子句中使用列别名。MySQL 文档对这种情况有这样的说法:

使用的conditional_exprON是可以在 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
于 2012-07-27T10:03:01.547 回答
9

为避免在查询中进行三次计算,您可以将外部计算包装在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

在这里,计算只进行了两次而不是三次。

于 2012-07-27T10:00:26.943 回答
1
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
于 2012-07-27T09:52:19.073 回答
1

您不能在查询 where 子句中使用派生值 - 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
于 2012-07-27T09:58:28.353 回答