MySQL - Left Outer Join y Like con wildchar %

   
Vista:

Left Outer Join y Like con wildchar %

Publicado por Dalsom (23 intervenciones) el 29/06/2015 17:11:02
Saludos a todos,
Estoy trabajando con MySql tratando de hacer una consulta como la que sigue :

select f.fundesc,o.orgdesc,c.*
from
contactos c left outer join
organizaciones o on c.idorg = o.idorg left outer join
funciones f on f.idfun = c.idfun
where c.nombre like '%Juan%' ;

En mi caso, en la tabla contactos tengo unos 5 nombres : Juan Armando, Alberto Juan, Tito Juanez, Arturo Mariano, y Maria Altagracia.

Para el resultado de la busqueda estoy esperando como resultado 3 filas, pero me estan saliendo todos los 5 registros.
Cuando el hago el query sin los left outer join funciona sin problemas. He probado la sentencia en MS Sql Server y funciona sin ningun cambio devolviendome 3 filas, mas no en MySql.
Alguien podria decirme que me he saltado en MySql que no esta saliendo como resultado lo esperado?

Gracias de antemano.

Las tablas :

conctactos
--------------
idcontacto int auto_increment primary key
nombre char(20) not null
apellido char(20) not null
idorg int null
idfun int null

organizaciones
------------------
idorg int auto_increment primary key
orgdesc char(20) not null

funciones
---------------
idfun int auto_increment primary key
fundesc char(20) not null
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

Left Outer Join y Like con wildchar %

Publicado por leonardo_josue (81 intervenciones) el 29/06/2015 17:50:34
Hola Dalsom:

Mucho ojo, el problema tal como lo mencionas no está en el LIKE, sino en los LEFT JOIN's... seguramente en alguna de tus tablas relacionadas tienes más de un registro que cumple con tus condiciones, por lo tanto aunque en tu tabla contactos tengas 3 registros, al hacer los JOINS puedes tener más de tres...

observa este ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mysql> SELECT * FROM tabla_padre;
+----------+-------------+
| id_padre | descripcion |
+----------+-------------+
|        1 | uno         |
|        2 | dos         |
|        3 | tres        |
+----------+-------------+
3 rows in set (0.00 sec)
 
mysql> SELECT * FROM tabla_hija;
+---------+----------+-------------+
| id_hija | id_padre | descripcion |
+---------+----------+-------------+
|       1 |        1 | 1.1         |
|       2 |        1 | 1.2         |
|       3 |        1 | 1.3         |
|       4 |        2 | 2.1         |
|       5 |        2 | 2.2         |
+---------+----------+-------------+
5 rows in set (0.00 sec)

la tabla PADRE tiene 3 registros, la tabla HIJA tiene 5 registros, pero qué pasa cuando haces un LEFT JOIN, observa:

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> SELECT * FROM tabla_padre
    -> LEFT JOIN tabla_hija ON tabla_padre.id_padre = tabla_hija.id_padre;
+----------+-------------+---------+----------+-------------+
| id_padre | descripcion | id_hija | id_padre | descripcion |
+----------+-------------+---------+----------+-------------+
|        1 | uno         |       1 |        1 | 1.1         |
|        1 | uno         |       2 |        1 | 1.2         |
|        1 | uno         |       3 |        1 | 1.3         |
|        2 | dos         |       4 |        2 | 2.1         |
|        2 | dos         |       5 |        2 | 2.2         |
|        3 | tres        |    NULL |     NULL | NULL        |
+----------+-------------+---------+----------+-------------+
6 rows in set (0.00 sec)

el resultado son 6 registros!!!

esto es perfectamente normal, así funcionan los LEFT JOIN's... sólo si tuvieras una relación 1 a 1 entre tus tablas entonces tendrías siempre el mismo número de registros en tus consultas.

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