2011-12-30 17 views
6

¿Cómo puedo usar mi alias de columna (lat y lng) de las dos subconsultas para hacer la calcu- lación de distancia debajo? Lo que básicamente trato de hacer es calcular la distancia entre dos ubicaciones usando valores de longitud y latitud. Pero de alguna manera mis alias no son utilizables en la consulta, ¿por qué?¿Cómo usar un alias de columna MySQL para los cálculos?

SELECT wp_posts.*, 
(SELECT wp_postmeta.meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = wp_posts.ID AND wp_postmeta.meta_value LIKE '41.%') AS lat, 
(SELECT wp_postmeta.meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = wp_posts.ID AND wp_postmeta.meta_value LIKE '2.%') AS lng, 
(3959 * acos(cos(radians(41.367682)) * cos(radians('lat')) * cos(radians('lng') -  radians(2.154077)) + sin(radians(41.367682)) * sin(radians('lat')))) AS distance 
FROM wp_posts, wp_postmeta 
WHERE wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = 'position' AND wp_posts.post_status = 'publish' AND wp_posts.post_type = 'page' AND wp_posts.post_date < NOW() 
GROUP BY ID 
ORDER BY distance ASC 
+1

¿Por qué pones lat y lng entre comillas en tu expresión? –

+0

¿Se ejecuta sin ningún error o se producen algunos errores al ejecutar esta consulta? – Lion

+0

Las comillas son necesarias para ejecutar la consulta, no obtengo errores y todo se devuelve correctamente, excepto que el cálculo de la distancia arroja el mismo valor para todos los registros, lo que significa que los valores ingresados ​​no se utilizan para nada. ¿Qué estoy haciendo mal aquí? – Chris

Respuesta

4

OK, lo que hay que hacer aquí es unirse a la misma mesa (wp_postmeta) dos veces bajo diferentes alias para que pueda utilizar diferentes condiciones 'dónde'. No tengo las tablas así que no puedo probar esto, pero este es el enfoque que usted quiere utilizar:

SELECT wp_posts.*, 
    (`alias_1`.meta_value) AS `lat`, 
    (`alias_2`.meta_value) AS `lng`, 
    (3959 * acos(cos(radians(41.367682)) * cos(radians(`lat`)) * cos(radians(`lng`) -  radians(2.154077)) + sin(radians(41.367682)) * sin(radians(`lat`)))) AS `distance` 
FROM wp_posts 
    LEFT JOIN `wp_postmeta` AS `alias_1` ON wp_posts.ID = alias_1.post_id 
    LEFT JOIN `wp_postmeta` AS `alias_2` ON wp_posts.ID = alias_2.post_id 
WHERE 
    wp_posts.post_status = 'publish' 
    AND wp_posts.post_type = 'page' 
    AND wp_posts.post_date < NOW() 
    AND `alias_1`.meta_key = 'position' 
    AND `alias_1`.meta_value LIKE '41.%' 
    AND `alias_2`.meta_key = 'position' 
    AND `alias_2`.meta_value LIKE '2.%' 
GROUP BY wp_posts.`ID` 
ORDER BY `distance` ASC 

que pueden tener algunos errores de sintaxis en allí, pero creo que es la lógica más o menos correcto Hazme saber si esto funciona.

+1

Gracias por sus sugerencias! Intenté su consulta pero recibí el mismo error que antes. ** Columna desconocida 'lat' en 'lista de campo' **. ¿Es posible que los alias no puedan ser referenciados en los cálculos? Parece dudoso para mí. – Chris

+0

Hmm ... lo dudo, pero adelante y edite la consulta para que cos (radianes ('lat')) se convierta en cos (radianes (' alias_1'.meta_value)) etc. y vea qué sucede. Encerré lat y lng en los respaldos j ust para una buena medida. –

+0

¡Creo que lo hizo! Ahora recibo una consulta de trabajo y la columna de distancia me está dando resultados ahora, aunque no estoy seguro de que sean correctos. Uno de los resultados dice "5.89936971664429e-05", ¿qué parece extraño? – Chris

1

Una vez que haya creado su alias (que se debe añadir las citas antes y después) no se debe hacer referencia a ella como una cadena ... referencias posteriores al alias debe estar encerrada entre comillas sencillas:

SELECT wp_posts.*, 
(SELECT wp_postmeta.meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = wp_posts.ID AND wp_postmeta.meta_value LIKE '41.%') AS 'lat', 
(SELECT wp_postmeta.meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = wp_posts.ID AND wp_postmeta.meta_value LIKE '2.%') AS 'lng', 
(3959 * acos(cos(radians(41.367682)) * cos(radians(`lat`)) * cos(radians(`lng`) -  radians(2.154077)) + sin(radians(41.367682)) * sin(radians(`lat`)))) AS `distance` 
FROM wp_posts, wp_postmeta 
WHERE wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = 'position' AND wp_posts.post_status = 'publish' AND wp_posts.post_type = 'page' AND wp_posts.post_date < NOW() 
GROUP BY `ID` 
ORDER BY 'distance' ASC 

http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html

+0

Recibo el error "Columna desconocida 'lat' en 'lista de campo'". Supongo que los alias no se pueden hacer referencia de esta manera? – Chris

+0

¡Ah! Usted tiene otro problema también. No debe tener múltiples instrucciones de selección a menos que esté ejecutando una subconsulta. Simplemente use "SELECCIONAR wp_posts. *, Wp_postmeta.meta_value como 'lat', wp_postmeta.meta_value como' lng' FROM wp_posts, wp_postmeta WHRE [LISTA DE SUS CONDICIONES WHERE) –

+0

Pero necesito los valores de esos campos (lat/lng) para el cálculo de la distancia - de ahí las subconsultas – Chris

Cuestiones relacionadas