Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

[SOLUCIONADO] Problemas con #1241 - Operand should contain 1 column(s)

Estas en el tema de Problemas con #1241 - Operand should contain 1 column(s) en el foro de Mysql en Foros del Web. Buenas tardes a todos Tengo un problema con una consulta que no consigo resolver. Veran... Tengo 2 tablas categorías y tiendas. El objetivo es que ...
  #1 (permalink)  
Antiguo 14/08/2014, 13:21
 
Fecha de Ingreso: febrero-2014
Ubicación: Madrid
Mensajes: 19
Antigüedad: 10 años, 2 meses
Puntos: 0
Problemas con #1241 - Operand should contain 1 column(s)

Buenas tardes a todos
Tengo un problema con una consulta que no consigo resolver. Veran...

Tengo 2 tablas categorías y tiendas. El objetivo es que me muestre las categorias a las que pertenecen las tiendas que tengo cerca de una dirección pasada por latitud y longitud e indique el número de tiendas que hay en ese esa distancia.

Para ello hago una consulta y una subconsulta.

La consulta es la siguiente:

Código MySQL:
Ver original
  1. SELECT `category_id`, `category_name`, `category_icon`, COUNT(`markers_category_id`) AS total
  2. FROM `category` LEFT JOIN markers ON category.category_id = markers.markers_category_id
  3. WHERE `category_id` IN (SELECT markers_category_id, ROUND(((acos(sin((40.367 * pi()/180)) *
  4. sin((markers.markers_lat*pi()/180))+cos((40.367 * pi()/180)) * cos((markers.markers_lat*pi()/180)) *
  5. cos(((-3.706 - markers.markers_lng) *pi()/180))))*180/pi())*60*1.1515*1609.344) AS distance FROM markers
  6. HAVING distance < 7000)
  7. GROUP BY `category_name`
Os agradecería si me pudierais echar una mano.
Gracias de antemano y saludos
  #2 (permalink)  
Antiguo 14/08/2014, 13:29
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problemas con #1241 - Operand should contain 1 column(s)

En principio, ese primer WHERE intenta comparar un determinado valor contra dos valores:
Código MySQL:
Ver original
  1.     `category_id`,
  2.     `category_name`,
  3.     `category_icon`,
  4.     COUNT(`markers_category_id`) AS total
  5.     `category`
  6.     LEFT JOIN markers ON category.category_id = markers.markers_category_id
  7.     `category_id` IN
  8.         (SELECT
  9.             markers_category_id,
  10.             ROUND(((acos(sin((40.367 * pi()/180)) * sin((markers.markers_lat*pi()/180))+cos((40.367 * pi()/180)) * cos((markers.markers_lat*pi()/180)) * cos(((-3.706 - markers.markers_lng) *pi()/180))))*180/pi())*60*1.1515*1609.344) AS distance
  11.        FROM markers
  12.        HAVING distance < 7000)
  13. GROUP BY `category_name`
La subconsulta del IN obtiene dos columnas, una llamada "markers_category_id", y otra "distance".
Eso por lo pronto, pero me parece que no es el único error.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 14/08/2014, 13:33
 
Fecha de Ingreso: febrero-2014
Ubicación: Madrid
Mensajes: 19
Antigüedad: 10 años, 2 meses
Puntos: 0
Respuesta: Problemas con #1241 - Operand should contain 1 column(s)

Si llevas razon gnzsoloyo pero no se me ocurre como hacer la subconsulta despues del IN ya que para hacerla necesito el ID de la tienda y la distancia. O quizas la consulta debo plantearla de otra forma. Pero ya no sé cómo hacerlo.

Última edición por tdcp; 14/08/2014 a las 13:41 Razón: Ampliación de la respuesta
  #4 (permalink)  
Antiguo 14/08/2014, 13:56
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problemas con #1241 - Operand should contain 1 column(s)

Hay dos caminos.
- El más eficiente es crear una stored function con ese cálculo, y usarla directamente. Para eso puede usar el ejemplo que tienes en las FAQs de MySQL (http://www.forosdelweb.com/f86/faqs-...1/#post4198983). Ese ejemplo te devuelve la distancia entre dos puntos geográficos en Km.
- Puedes meterlo en las propias condiciones del WHERE de la subconsulta:
Código MySQL:
Ver original
  1.     `category_id`,
  2.     `category_name`,
  3.     `category_icon`,
  4.     COUNT(`markers_category_id`) AS total
  5.     `category`
  6.     LEFT JOIN markers ON category.category_id = markers.markers_category_id
  7.     `category_id` IN
  8.         (SELECT
  9.             markers_category_id
  10.        FROM markers
  11.        WHERE  ( ROUND(((acos(sin((40.367 * pi()/180)) * sin((markers.markers_lat*pi()/180))+cos((40.367 * pi()/180)) * cos((markers.markers_lat*pi()/180)) * cos(((-3.706 - markers.markers_lng) *pi()/180))))*180/pi())*60*1.1515*1609.344) ) < 7000)
  12. GROUP BY `category_name`

A mi entender la SF sería el mejor camino...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 14/08/2014, 14:08
 
Fecha de Ingreso: febrero-2014
Ubicación: Madrid
Mensajes: 19
Antigüedad: 10 años, 2 meses
Puntos: 0
Respuesta: Problemas con #1241 - Operand should contain 1 column(s)

Uff, gracias gnzsoloyo me has salvado de un dolor de cabeza enorme, la consulta la realiza y me muestra sólo las categorias de las tiendas que hay en esa distancia, lo que ocurre es que el COUNT lo hace de todas las tiendas de cada categoría y no de las que hay en la distancia que le pasamos.
Ejemplo:
Si en una categoria hay un total de 350 tiendas, son las que muestra.
Pero a 7 kms. de distancia en esa categoría solo hay 15.
¿Que puede estar pasando?
  #6 (permalink)  
Antiguo 14/08/2014, 19:39
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problemas con #1241 - Operand should contain 1 column(s)

Lo que está pasando es que no estás calculando la distancia respecto de ningún punto.
Yo veo que sólo usas un par de coordenadas LAT/LONG, pero no hay ningún punto de referencia, y para que la query funcione debería existir alguno.
¿Cuál es el centro del cálculo? ¿Los 7 Km respecto a qué?

Por cierto, yo tengo la sospecha de que la query funcionaría mejor también:
Código MySQL:
Ver original
  1.     `category_id`,
  2.     `category_name`,
  3.     `category_icon`,
  4.     COUNT(`category_id`) total
  5.     `category` C
  6.         INNER JOIN
  7.     markers ON C.category_id = M.markers_category_id
  8.     (ROUND(((ACOS(SIN((40.367 * PI() / 180)) * SIN((M.markers_lat * PI() / 180)) + COS((40.367 * PI() / 180)) * COS((M.markers_lat * PI() / 180)) * COS(((- 3.706 - M.markers_lng) * PI() / 180)))) * 180 / PI()) * 60 * 1.1515 * 1609.344)) < 7000
  9. GROUP BY `category_name`
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 14/08/2014, 23:04
 
Fecha de Ingreso: febrero-2014
Ubicación: Madrid
Mensajes: 19
Antigüedad: 10 años, 2 meses
Puntos: 0
Respuesta: Problemas con #1241 - Operand should contain 1 column(s)

El funcionamiento es el siguiente:
El usuario envía su posicion, en este caso, las coordenadas son 40.367 y -3.707
Calcula la distancia respecto a todas las tiendas, para ello utiliza la posicion de cada tienda: markers_lat, markers_lng.
Y le dice que obtenga solo las tiendas que estén a menos de 7 kms. de distancia (distance) con respecto a la posicion del usuario (centro del calculo).
  #8 (permalink)  
Antiguo 14/08/2014, 23:23
 
Fecha de Ingreso: febrero-2014
Ubicación: Madrid
Mensajes: 19
Antigüedad: 10 años, 2 meses
Puntos: 0
Respuesta: Problemas con #1241 - Operand should contain 1 column(s)

Antes respondí sin haber probado la query que sugerías, la he probado y ahora funciona como yo quiero (a la perfección).
Con tu query mejorada obtengo el resultado esperado.

Gracias por todo, amigo, me has sacado de un apuro grande.

Etiquetas: mysql+consulta
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:58.