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

Ayudita con select

Estas en el tema de Ayudita con select en el foro de Mysql en Foros del Web. Hola máquinas! A ver si me podeis hechar una mano con un select que no me acaba de salir. Tengo una tabla que almacena el ...
  #1 (permalink)  
Antiguo 29/10/2008, 04:05
 
Fecha de Ingreso: septiembre-2008
Mensajes: 37
Antigüedad: 15 años, 7 meses
Puntos: 0
Ayudita con select

Hola máquinas!

A ver si me podeis hechar una mano con un select que no me acaba de salir.

Tengo una tabla que almacena el nombre del usuario, otra que almacena los idiomas que habla el usuario, y una tercera que almacena los deportes que practica

el usuario.

Lo que quiero es obtener el nombre del usuario que habla Español e Inglés, y que practique cualquier deporte.


La estructura de las tablas es la siguiente:
Datos t1:
id [1]
id_usuario [34]
nombre [Juan]

Datos t2:
id [1]
id_usuario [34]
idioma [p.e: ESpañol]
---------------------
id [2]
id_usuario [34]
idioma [Inglés]


Datos t3:
id [1]
id_usuario [34]
deporte [fútbol]
---------------------
id [2]
id_usuario [34]
deporte [basquet]
----------------------
id [3]
id_usuario [34]
deporte [hockey]


El select que tengo (y que no me devuelve ningún resultado) es el siguiente:
SELECT DISTINCTROW t1.nombre
FROM t1
INNER JOIN t2 ON t2.id_usuario=t1.id_usuario
INNER JOIN t3 ON t3.id_usuario=t1.id_usuario
WHERE ((t2.idioma='Español') OR (t2.id_idioma='Inglés'))
AND t3.deporte LIKE '%'
GROUP BY t1.id_usuario HAVING COUNT(t2.id)=2

Si pongo el siguiente funciona sin problemas:
SELECT DISTINCTROW t1.nombre
FROM t1
INNER JOIN t2 ON t2.id_usuario=t1.id_usuario
INNER JOIN t3 ON t3.id_usuario=t1.id_usuario
WHERE ((t2.idioma='Español') OR (t2.id_idioma='Inglés'))
AND t3.id_usuario=t1.id_usuario //AQUI ESTA EL CAMBIO
GROUP BY t1.id_usuario HAVING COUNT(t2.id)=2

Pero no me interesa hacerlo así, ya que en ocasiones la consulta se hará con algún deporte en concreto.


Gracias por vuestra ayuda!
  #2 (permalink)  
Antiguo 29/10/2008, 05:35
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Ayudita con select

No te lies...

La consulta no puede ser polivalente para los dos casos que planteas (con de porte o sin deporte) puesto que tendràs que introducir el valor de la variable donde tengas el deporte o pasarlo a cadena vacia puesto que el null te daria problemas.

Luego usa un condicional para usar una consulta u otra en funcion de si tienes o no deporte...

Sin deporte... no hace falta que intervenga para nada la t3

SELECT t1.nombre
FROM t1
INNER JOIN t2 ON t2.id_usuario=t1.id_usuario
WHERE ((t2.idioma='Español') OR (t2.id_idioma='Inglés'))
GROUP BY t1.id_usuario HAVING COUNT(t2.id)=2


Con deporte

SELECT t1.nombre
FROM t1
INNER JOIN t2 ON t2.id_usuario=t1.id_usuario
INNER JOIN t3 ON t3.id_usuario=t1.id_usuario
WHERE ((t2.idioma='Español') OR (t2.id_idioma='Inglés'))
AND t3.deporte='$Variable_con_el deporte'
GROUP BY t1.id_usuario HAVING COUNT(t2.id)=2

DISTINCTROW no hace falta ya que ya estas haciendo el GROUP BY

Si?

Quim
  #3 (permalink)  
Antiguo 29/10/2008, 05:55
 
Fecha de Ingreso: septiembre-2008
Mensajes: 37
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Ayudita con select

Hola Quim,

Ya había pensado la solución de utilizar el condicional y realizar dos consultas diferentes, pero quería saber si se podría hacer de otra forma.

Y si, tienes razon referente al DISTINCTROW y el GROUP BY, se me ha colado.

Gracias.
  #4 (permalink)  
Antiguo 30/10/2008, 01:40
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Ayudita con select

Para hacerlo con una sola consulta mira la sintaxis del LIKE seguramente habra una forma de hacerlo pero seguro que tendràs que tratar el contenido de la variable donde hipoteticamente tendrás el deporte. Tendras que poner un condicional para convertir el nulo en cadena vacia para poderla usar en el LIKE con lo que ya tienes un condicional. Y por otro lado cuando sea nulo estaras usando t3 en la consulta inecesariamente con lo que será menos eficiente.

Quim
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 04:21.