2012-07-27 11 views
5

Tengo una consulta de este modo:MySQL usando combinaciones internas en un alias de una columna calculada

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 

Si lo dejo como está, me siguen dando:

Unknown column 'distance' in 'on clause' 

Pero si pongo User.distance en lugar de sólo la distancia, me sale:

MySQL syntax error near.... 

¿Puedo no utilizar alias' de esta manera en un campo calculado? El 10 * 10 es solo un simple marcador de posición ya que el cálculo es mucho más complejo.

+0

posible duplicado de [El uso de un alias de columna en la cláusula WHERE de la consulta de MySQL produce un error] (http://stackoverflow.com/questions/942571/using-column-alias-in-where-clause-of-mysql-query-produces -an-error) – Joni

Respuesta

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

No se puede utiliza valores derivados de una consulta en la cláusula - donde se utiliza para restringir los registros y qué índices de usar - valores derivados no pueden ser utilizados por el optimizador de lo que es necesario para filtrar los resultados finales .

no muy seguro de lo que estás haciendo, pero intentar algo como:

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

Para evitar tener que hacer el cálculo tres veces en la consulta, se puede envolver el cálculo exterior en una subselección FROM, que se dará acceso al nombre del campo de alias (donde no era accesible en su búsqueda original):

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 

en este caso, el cálculo sólo se realiza dos veces en lugar de tres.

10

Está intentando utilizar un alias de columna en la cláusula ON. El MySQL documentation tiene esto que decir acerca de esta situación:

la conditional_expr se utiliza con ON es cualquier expresión condicional de la forma que se puede utilizar en una cláusula WHERE.

And also:

estándar SQL no permite referencias a los alias de columna en una cláusula WHERE. Esta restricción se impone porque cuando se evalúa la cláusula WHERE, es posible que el valor de la columna aún no se haya determinado. Por ejemplo, la siguiente consulta es ilegal:

Dicho esto, pueden los variables de utilizar para calcular la expresión en la cláusula ON y luego utilizar el valor en la lista de columnas, así:

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

No hay una cláusula WHERE en el SQL del autor. –

+1

fijo @JohnFactorial – Joni

Cuestiones relacionadas