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

Como demonios hago esta consulta xD

Estas en el tema de Como demonios hago esta consulta xD en el foro de Mysql en Foros del Web. Hola buenas a todos, tengo un problema, tengo una consulta en la que hago un inner join a una tabla con otra, y a esta ...
  #1 (permalink)  
Antiguo 23/03/2012, 22:15
 
Fecha de Ingreso: marzo-2012
Mensajes: 7
Antigüedad: 7 años, 11 meses
Puntos: 0
Pregunta Como demonios hago esta consulta xD

Hola buenas a todos, tengo un problema, tengo una consulta en la que hago un inner join a una tabla con otra, y a esta segunda con una tercera. Bien pues la segunda es la que relaciona las filas de las tablas, en la segunda pueden haber varios WHERES, y no se como hacerlo, aqui teneis la llamada:
Código:
SELECT * FROM locales 
INNER JOIN rel_locales_filtros ON locales.id = rel_locales_filtros.idl
INNER JOIN filtros ON rel_locales_filtros.idf = filtros.id

WHERE filtros.id = 1 AND filtros.id = 9

GROUP BY locales.titulo ORDER BY locales.id DESC
Ahi estaria relacionando el local con 2 filtros distintosy asi no sirve da error,

¿como lo podria hacer ?


Saludos y gracias de antemano
  #2 (permalink)  
Antiguo 24/03/2012, 12:07
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.323
Antigüedad: 12 años, 2 meses
Puntos: 2654
Respuesta: Como demonios hago esta consulta xD

Código MySQL:
Ver original
  1.     locales L
  2.     INNER JOIN rel_locales_filtros RLF ON L.id = RLF.idl
  3.     INNER JOIN filtros F ON RLF.idf = F.id
  4.     F.id IN(1, 9)
  5. GROUP BY L.titulo
Y antes que preguntes, L, F y RLF son alias de las tablas, usados para simplificar la sintaxis y facilitar la lectura.
__________________
¿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 24/03/2012, 18:13
 
Fecha de Ingreso: marzo-2012
Mensajes: 7
Antigüedad: 7 años, 11 meses
Puntos: 0
Respuesta: Como demonios hago esta consulta xD

Gracias gonzo, lo e entendido a la perfeccion, ahora tengo una duda, si en vez de cojer los que tengan relacion al filtro 1 o al filtro 19, quiero cojer que tenga relacion a los dos filtros, no a uno solo de los dos.... ¿como seria?

Saludos, gracias de antemano ! :)
  #4 (permalink)  
Antiguo 25/03/2012, 18:02
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.323
Antigüedad: 12 años, 2 meses
Puntos: 2654
Respuesta: Como demonios hago esta consulta xD

Allí, infortunadamente, la cosa se complica.
Hay varias formas de lograrlo, pero todas o casi todas requieren llamar dos veces a la tabla Filtros, asociandole un alias diferente a cada una, para poder ubicar las coincidencias.
De todos modos, hay una solución mas o menos sencilla, si lo que necesitas es sólo el Local relacionado con esos filtros y no los datos vinculados a los filtros:
Código MySQL:
Ver original
  1.     locales L
  2.     INNER JOIN rel_locales_filtros RLF ON L.id = RLF.idl
  3.     INNER JOIN filtros F ON RLF.idf = F.id
  4.     F.id IN(1, 9)
  5. GROUP BY L.titulo
Esto devolvería aquellos registros donde haya dos coincidencias al menos. Siendo que no puede repetirse una misma coincidencia de un ID de filtro más de una vez, la otra forzosamente correspondería al otro filtro.
__________________
¿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 25/03/2012, 20:31
 
Fecha de Ingreso: marzo-2012
Mensajes: 7
Antigüedad: 7 años, 11 meses
Puntos: 0
Respuesta: Como demonios hago esta consulta xD

me da error en la linea del HAVING... :S
  #6 (permalink)  
Antiguo 25/03/2012, 22:24
 
Fecha de Ingreso: marzo-2012
Mensajes: 7
Antigüedad: 7 años, 11 meses
Puntos: 0
Respuesta: Como demonios hago esta consulta xD

Os añado la info de las tablas para mas info...
Cita:
CREATE TABLE `filtros` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`tipo` int(11) NOT NULL,
`filtro` text NOT NULL,
`idpadre` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;

CREATE TABLE `locales` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`titulo` text NOT NULL,
`direccion` text NOT NULL,
`web` text NOT NULL,
`email` text NOT NULL,
`telefono` int(11) NOT NULL,
`promos` varchar(500) NOT NULL,
`apertura` varchar(100) NOT NULL,
`cierre` varchar(11) NOT NULL,
`dias` text NOT NULL,
`descripcion` longtext NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;

CREATE TABLE `rel_locales_filtros` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`idl` int(11) NOT NULL,
`idf` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
  #7 (permalink)  
Antiguo 26/03/2012, 05:08
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.323
Antigüedad: 12 años, 2 meses
Puntos: 2654
Respuesta: Como demonios hago esta consulta xD

Cita:
Iniciado por elefren Ver Mensaje
me da error en la linea del HAVING... :S
Exactamente qué dice el 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)
  #8 (permalink)  
Antiguo 26/03/2012, 06:41
 
Fecha de Ingreso: marzo-2012
Mensajes: 7
Antigüedad: 7 años, 11 meses
Puntos: 0
Respuesta: Como demonios hago esta consulta xD

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'HAVING COUNT(*)=2 LIMIT 0, 30' at line 10

No dice mucho creo...
  #9 (permalink)  
Antiguo 26/03/2012, 18:19
 
Fecha de Ingreso: marzo-2012
Mensajes: 7
Antigüedad: 7 años, 11 meses
Puntos: 0
Respuesta: Como demonios hago esta consulta xD

Ya di con la solucion, aunque no funcionara gracias a todos por vuestra ayuda, aqui os la dejo por si os sirve de algo, parece que va perfecto... :D
Cita:
SELECT *
FROM locales l
INNER JOIN rel_locales_filtros rlf ON l.id = rlf.idl
INNER JOIN filtros f ON rlf.idf = f.id
WHERE rlf.idf
IN ( 1, 17, 24 )
GROUP BY l.id
HAVING count( DISTINCT rlf.idf ) =3
ORDER BY l.id DESC
LIMIT 0 , 30

Etiquetas: join, select, tabla
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:27.