SQL - Busqueda con JOIN

   
Vista:

Busqueda con JOIN

Publicado por Jorge (3 intervenciones) el 08/08/2011 16:11:12
Hola, tengo un problema que no se como resolverlo. Sería este caso:
Una tabla de empresas con campos id y nombre
Una tabla de tipo_de_empresa con campos id y tipo
Y una tabla que relaciona las dos; empresas_tipo con campos idempresa y idtipo

Entonces, una empresa puede ser de varios tipos y lo que yo quiero es poder hacer un buscador que puedas buscar por ejemplo: una empresa que sea de tipo 5 y tipo 6 a la vez.

Lo que he hecho es lo siguiente pero no me devuelve ningun resultado:

SELECT empresas.nombre
FROM empresas
LEFT JOIN empresas_tipo ON empresas.id = empresas_tipo.idempresa
WHERE
empresas_tipo.idtipo = 5
AND
empresas_tipo.idtipo = 6
GROUP BY empresas.id

Sin embargo si solo busco por empresas de tipo 5 si que me da resultados y si busco también solo por tipo 6 también tengo resultados. Supongo que hago algo mal en el WHERE.

Si alguien me pudiera ayudar se lo agradeceria mucho.
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

Busqueda con JOIN

Publicado por leonardo_josue (880 intervenciones) el 08/08/2011 17:53:39
Hola Jorge.

La consulta como lo estás planteando nunca te va a regresar ningún registro, ya que un registro no puede tener dos idtipo's a la vez....

Vamos poniendo algunos datos para ver si puedo ayudarte.

Supongamos que tu tabla empresas tiene la siguiente información:

1
2
3
4
5
6
7
8
9
10
mysql> select  * from empresas;
+------+--------+
| id   | nombre |
+------+--------+
|    1 | uno    |
|    2 | dos    |
|    3 | tres   |
|    4 | cuatro |
+------+--------+
4 rows in set (0.00 sec)


y tu tabla empresas_tipo tiene más o menos lo siguiente:

1
2
3
4
5
6
7
8
9
10
11
mysql> select * from empresas_tipo;
+------+-----------+--------+
| id   | idempresa | idtipo |
+------+-----------+--------+
|    1 |         1 |      5 |
|    2 |         1 |      6 |
|    3 |         2 |      5 |
|    4 |         3 |      6 |
|    5 |         4 |      7 |
+------+-----------+--------+
5 rows in set (0.00 sec)


Aquí se puede observar que la empresa 1 es de tipo 5 y 6, la empresa 2 sólo es de tipo 5 y la empresa 3 sólo es de tipo 6 y la empresa 4 no es ni de tipo 5 ni de tipo 6

Con estos datos podrías hacer lo siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> SELECT e.* FROM empresas e INNER JOIN
    -> (
    -> SELECT idempresa FROM empresas_tipo
    -> WHERE idtipo IN (5,6)
    -> GROUP BY idempresa
    -> HAVING COUNT(*) = 2
    -> ) et ON e.id = et.idempresa;
+------+--------+
| id   | nombre |
+------+--------+
|    1 | uno    |
+------+--------+
1 row in set (0.00 sec)


Observa que el select interno en primer lugar utiliza una condición tipo IN para seleccionar sólo aquellas empresas que sean de tipo 5 y/o 6, por lo tanto la empresa 4 queda descartada. Ahora bien, si no pusieras el GROUP BY y el HAVING también estarías regresando las empresas 2 y 3, pues estas son de al menos un tipo. Al poner HAVING count(*) = 2, estás obligando a que la empresa sea de ambos tipos, por lo tanto la única que cumple el requisito es la empresa UNO

el ejemplo está desarrollado en MySQL, pero la sintaxis sería válida para la mayoría de los DBMS actuales, por si utilizaras alguna otra BD.

Dale un vistazo al código, y si tienes alguna duda lo comentas en el foro para tratar de ayudarte.

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

Busqueda con JOIN

Publicado por Jorge (3 intervenciones) el 09/08/2011 10:42:42
Hola Leo,

Funciona perfectamente tal como me has puesto. Y te agradezco mucho lo bien que lo has explicado. He aprendido mucho con esto.

Muchísimas gracias,
Saludos!
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