SQL - Entendiendo las left join

 
Vista:

Entendiendo las left join

Publicado por Toribio (1 intervención) el 23/09/2012 20:15:36
Hola

Recien comienzo con SQL, me manejo a un nivel sencillo, y recientemente estoy practicando con la anidacion de querys y las combinaciones outer join. Mi pregunta podria parecerles muy sencilla, pero ejercitando según mi manual no consigo hacer funcionar por sintaxis una query.

Dada una query que me obtiene unos datos de una tabla, y un email de otra...

SELECT nom, ape, dni FROM users2 left join users on users2.user_id=users.id WHERE 1=1

Esta query me funciona bien, y la termino con 1=1 como "truco" para, en un formulario php que estoy construyendo, i concatenando en un string una query completa que después será la que lance. Entonces, si en un campo de este formulario el usuario me marca que desea filtrar por varones, mi problema es como sería la sintaxis de la query anterior, si quiere juntarla con esta otra, que tambien me funciona bien

SELECT * FROM datos_perso_usu WHERE sexo = 'male'

¿Me explico? Ambas dos select funcionan, y creo saber como plantear mi código php para gestionar el formulario, anidando substring hasta tener un string finalq ue sea la consulta que el usuario ha creado por interfaz. Pero me encuentro a nivel de SQL de que no sé como enlazar estas dos consultas creía que sería algo tan simple como ...WHERE 1=1 AND (SELECT * FROM.....) pero no es el operador AND lo que necesito. He estado leyendo sobre las outer join sin entender muy bien acerca del operador IN, pero lo que he estado probando hasta el momento tampoco me soluciona nada. ¿Como supuestamente debiera de redactar la SQL?

Sinceras gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve
Val: 135
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Entendiendo las left join

Publicado por xve (284 intervenciones) el 24/09/2012 07:47:50
Hola Toribio, no especificas que motor de base de datos estas utilizando...

No entiendo muy bien lo del while 1=1... no debería de ser necesario en ningún caso.

Para juntar dos consultas, diferentes, puedes utilizar la clausula UNION, pero las dos consultas tienen que devolver los mismos campos.

Otra manera, es juntar las consultas de esta manera:
1
2
3
4
5
SELECT
t1.nombre, t2.sexo
FROM
(SELECT * FROM Tabla1) as t1,
(SELECT * FROM Tabla2) as t2


Espero que te sirva.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Entendiendo las left join

Publicado por leonardo_josue (1173 intervenciones) el 24/09/2012 20:48:11
Hola Toribio...

No me quedó claro qué es lo que necesitas, sobre todo porque no expresas adecuadamente como son tus tablas ni las relaciones que existen entre ellas, pero veamos si esto te puede servir en algo... partamos del hecho que la consulta que dices funciona correctamente:

1
2
3
4
SELECT nom, ape, dni
FROM users2
LEFT JOIN users ON users2.user_id = users.id
WHERE 1=1


Si entendí correctamente, lo que pretendes es filtrar los resultados de la consulta anterior para mostrar sólo los que cumplan cierto criterio... este criterio está dada por una tercer tabla y que correspondería sólo a los varones... sin embargo no nos dices como es que está relacionada esta tercer tabla, pero suponiendo que exista también el campo id podrías hacer algo como esto:

1
2
3
4
5
SELECT nom, ape, dni
FROM users2 U2
LEFT JOIN users U1 ON U2.user_id = U1.id
INNER JOIN datos_perso_usu DPU  ON  DPU.id = U2.user_id
WHERE 1=1


También podrías hacerlo con una sentencia EXISTS

1
2
3
4
5
6
7
SELECT nom, ape, dni
FROM users2 U2
LEFT JOIN users U1 ON U2.user_id = U1.id
WHERE 1=1
AND EXISTS (
  SELECT id FROM datos_perso_usu DPU
  WHERE sexo = 'male' AND U2.user_id = DPU.id)


O inclusive, aunque menos recomendable, con una sentencia IN

1
2
3
4
5
SELECT nom, ape, dni
FROM users2 U2
LEFT JOIN users U1 ON U2.user_id = U1.id
WHERE 1=1
AND u2.user_id in ( SELECT id FROM datos_perso_usu WHERE sexo = 'male')


Prueba cualquiera de las opciones... si esto no te sirve, es conveniente en primer lugar, como lo hizo notar xve que nos digas con qué BD estás trabajando, que nos digas también cuál es la estructura de tus tablas y que nos pongas algunos datos de ejemplo de cada una de ellas, así podemos hacer algunas pruebas y ayudarte mejor.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar