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

Ayuda con query

Estas en el tema de Ayuda con query en el foro de Mysql en Foros del Web. Tengo un pequeño sistema de galerias con taxonomy en las imagenes. El sistema esta compuesto por tres tablas, una almacena las imagenes y le asigna ...
  #1 (permalink)  
Antiguo 04/01/2010, 19:18
Avatar de seinkraft  
Fecha de Ingreso: diciembre-2007
Mensajes: 119
Antigüedad: 16 años, 4 meses
Puntos: 1
Ayuda con query

Tengo un pequeño sistema de galerias con taxonomy en las imagenes.

El sistema esta compuesto por tres tablas, una almacena las imagenes y le asigna una id a cada imagen, otra guarda las tags y asigna una id a cada tag y la ultima vincula el id de la tag con la ide de la imagen.

(images.id) <---> (nodes.image_id | nodes.tag_id) <---> (tags.id | tags.tag)

Y el problema que estngo es que no puedo realizar una busqueda de imagenes por dos o mas tags, es decir, si busco "car wheels" para que me devuelva las ids de la imagenes que contengan como tag "car" y "wheels" a su vez.

Este es my query actual:

Código SQL:
Ver original
  1. SELECT images.*
  2. FROM images
  3. JOIN nodes
  4. ON images.id = nodes.image_id
  5. WHERE tag_id
  6. IN (SELECT tags.id FROM tags WHERE tags.tag IN ('car','wheels'))
  7. GROUP BY images.id

El problema es que el primer IN en vez de "filtrar" los resultados los suma...es decir no busca por "car wheels" sino que busca todas las imagenes que contenga el tag "car" y las suma con los resultados de la busqueda de "wheels" por lo que falla.

Ayuda por favor.
  #2 (permalink)  
Antiguo 04/01/2010, 20:18
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, 4 meses
Puntos: 2658
Respuesta: Ayuda con query

Cita:
El problema es que el primer IN en vez de "filtrar" los resultados los suma...es decir no busca por "car wheels" sino que busca todas las imagenes que contenga el tag "car" y las suma con los resultados de la busqueda de "wheels" por lo que falla.
Es que eso es precisamente lo que le estás diciendo que haga... Que busque todos los registros de tags que en el campo tag contenga o "car" o "wheels".
Si lo que quieres es que busque "car wheels", entonces eso es lo que tienes que poner:
Código MySQL:
Ver original
  1. SELECT images.*
  2. FROM images JOIN nodes ON images.id = nodes.image_id
  3. WHERE tag_id IN (SELECT tags.id FROM tags WHERE tags.tag LIKE  '%car wheel%')
  4. GROUP BY images.id
o bien
Código MySQL:
Ver original
  1. SELECT images.*
  2. FROM images JOIN nodes ON images.id = nodes.image_id
  3. WHERE tag_id IN (SELECT tags.id FROM tags WHERE tags.tag REGEXP '%car%wheel%')
  4. GROUP BY images.id
__________________
¿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 04/01/2010, 20:38
Avatar de seinkraft  
Fecha de Ingreso: diciembre-2007
Mensajes: 119
Antigüedad: 16 años, 4 meses
Puntos: 1
Respuesta: Ayuda con query

Pero tags.tag solo guarda una palabra pot registro.

No guarda todos los tags de la imagen en un registro...por eso no funcionara '%car wheel%'
  #4 (permalink)  
Antiguo 04/01/2010, 21:01
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, 4 meses
Puntos: 2658
Respuesta: Ayuda con query

Bien, pero eso no surge de tu planteo inicial. Cuando dices:
Cita:
en vez de "filtrar" los resultados los suma...es decir no busca por "car wheels"
pareces estar diciendo que "car wheels" era el contenido de ese campo.

En definitiva el problema sigue siendo como te lo planteo: La consulta no falla al sumar porque te devuelve exactamente lo que pide... la suma de ambos casos. Lo que puede ser que pase es que no estés pidiendo lo que realmente estás buscando.

El agrupamiento que estás haciendo lo haces por imágenes. Eso significa que si la misma imagen aparece relacionada con dos registros de node que se correspondan con dos tags, uno "car" y el otor "wheels", se sumarán.
Tu problema con esta consulta es que o no se debe agrupar por imagenes, o el IN() no debe incluir los dos valores, o bien debes plantearte que sea excluyente.

En todo caso, lo que debes analizar es el contenido de las tablas, porque obviamente tienes una discriminación de registros incorrecta.
__________________
¿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 04/01/2010, 21:07
Avatar de seinkraft  
Fecha de Ingreso: diciembre-2007
Mensajes: 119
Antigüedad: 16 años, 4 meses
Puntos: 1
Respuesta: Ayuda con query

Se que las tablas estan correctas, de eso estoy seguro y se que los valores que retorna:

Código SQL:
Ver original
  1. SELECT tags.id FROM tags WHERE tags.tag IN ('car','wheels')

tambien son correctos ya que me devuelve dos id que son los que corresponden a los tags. Lo que no logro hacer es que me devuelva solo la imagen que tiene dos entradas en la tabla nodes una entrada que vincula al tag "car" y otra que vincula al tag "wheels". Es ahi el problema.

Solo deberia devolver la imagen que contiene el nodo hacia "car" y el nodo hacia "wheels" y no se como hacerlo.
  #6 (permalink)  
Antiguo 04/01/2010, 21:15
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, 4 meses
Puntos: 2658
Respuesta: Ayuda con query

Cita:
tambien son correctos ya que me devuelve dos id que son los que corresponden a los tags. Lo que no logro hacer es que me devuelva solo la imagen que tiene dos entradas en la tabla nodes una entrada que vincula al tag "car" y otra que vincula al tag "wheels". Es ahi el problema.
Comprendo.
Tu problema es que eso se hace con el HAVING... No solamente con un GROUP BY.
Código MySQL:
Ver original
  1. SELECT images.*
  2. FROM images  INNER JOIN nodes ON images.id = nodes.image_id
  3. WHERE tag_id IN (SELECT tags.id FROM tags WHERE tags.tag IN ('car','wheels'))
  4. GROUP BY images.id
Pruebalo de este modo.
__________________
¿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 04/01/2010, 21:19
Avatar de seinkraft  
Fecha de Ingreso: diciembre-2007
Mensajes: 119
Antigüedad: 16 años, 4 meses
Puntos: 1
Respuesta: Ayuda con query

Y que sucede si tengo mas tags? porque la cantidad de tags a buscar es un valor dinamico...es decir, el usuario puede buscar las tags que desee.

Si defino que sea = 2 pero son 3 o mas tags o una sola la query fallara. O me equivoco?
  #8 (permalink)  
Antiguo 04/01/2010, 21:43
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, 4 meses
Puntos: 2658
Respuesta: Ayuda con query

En ese caso tendrás que crear la sentencia dinámicamente en el programa, para que el resultado se adapte a tus necesidades.
Sigue el patrón que te di y resuelve el problema en el lenguaje que estés usando...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 05/01/2010, 08:28
Avatar de seinkraft  
Fecha de Ingreso: diciembre-2007
Mensajes: 119
Antigüedad: 16 años, 4 meses
Puntos: 1
Respuesta: Ayuda con query

Sep sep, funciono perfecto.

Muchisimas gracias.-
  #10 (permalink)  
Antiguo 05/01/2010, 08: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, 4 meses
Puntos: 2658
Respuesta: Ayuda con query

Por nada. Me alegro que haya salido adelante todo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: query
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 12:20.