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

Mejorar consulta

Estas en el tema de Mejorar consulta en el foro de Mysql en Foros del Web. Hola chicos buenos días a todos, Vera tengo un problema pasa que estoy haciendo lo siguiente.. tengo dos tablas : proveedores (tabla 1) id_proveedor nombre ...
  #1 (permalink)  
Antiguo 05/01/2012, 10:37
Avatar de arsenal  
Fecha de Ingreso: agosto-2008
Mensajes: 65
Antigüedad: 15 años, 8 meses
Puntos: 2
Mejorar consulta

Hola chicos buenos días a todos,

Vera tengo un problema pasa que estoy haciendo lo siguiente..

tengo dos tablas :

proveedores (tabla 1)
id_proveedor
nombre

empresa_proveedor (tabla 2)
id
id_empresa
id_proveedor

La tabla 2 como veran solo es para relacionar empresa con algun proveedor


entonces uso esta consulta para mostrarle a la empresa registrada los proveedores que contamos


Código MySQL:
Ver original
  1. select p.id_proveedor,p.nombre
  2.             FROM empresa_proveedor ep
  3.             RIGHT JOIN proveedores p ON ep.proveedor = p.id_proveedor
  4.             WHERE ep.proveedor IS NULL

la idea de esta consulta es que me muestre los proveedores que estan libre que no estan asociados a la empresa, o sea:

tengo en la tabla 1 3 registros asi:

id_proveedor nombre
1 proveedor 1
2 proveedor 2
3 proveedor 3


en la tabla 2 tengo los siguientes registros
id id_empresa id_proveedor
1 1 1



la consulta me debe arrojar solo el proveedor 2 y proveedor 3 porque proveedor ya lo tiene asociado.


esa consulta me funciona bien pero el problema es cuando ya es otra empresa, ejemplo a la empresa 2 solo le muestra proveedor 2 y proveedor 3, esto pasa porque empresa 1 ya tiene a proveedor 1, cuando a empresa 2 le deberia mostrar los 3 proveedores disponibles o sea proveedor 1, proveedor 2 y proveedor 3


porque pasa esto?
  #2 (permalink)  
Antiguo 05/01/2012, 10:58
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Mejorar consulta

En esa consulta no debería devolverte nada, porque en la tabla relacional la empresa 2 no debería existir. Sólo deberían estar los proveedores si efectivamente ya han sido asignados.
Para que te devuelva los no asignados a la empresa, deberías estar usando las tres tablas y no sólo dos.
__________________
¿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 05/01/2012, 11:24
Avatar de leo_  
Fecha de Ingreso: abril-2008
Mensajes: 40
Antigüedad: 16 años
Puntos: 11
Sonrisa Respuesta: Mejorar consulta

Hola si entendi bien la consulta seria asi:
Código MySQL:
Ver original
  1. select id_empresa, t1.id_proveedor, nombre
  2. from proveedores t1, empresa_proveedor t2
  3. where t2.id_proveedor <> t1.id_proveedor
Saludos.
__________________
Di que no haces las cosas para que te las agradezcan, pero trata de hacerlas para gente agradecida. Cipriano.
  #4 (permalink)  
Antiguo 05/01/2012, 11:26
Avatar de arsenal  
Fecha de Ingreso: agosto-2008
Mensajes: 65
Antigüedad: 15 años, 8 meses
Puntos: 2
Respuesta: Mejorar consulta

Hola gnzsoloyo,

Cual es la 3era tabla de la empresa? pasa que yo el id de la empresa ya lo conozco porque lo guardo en una session al loguearse.

Por eso quiero que me ayuden a mejorarla, la consulta si existe la empresa 2 no muestra nada pero necesiito que cada empresa se le muestre los proveedores disponbles.

Por ejemplo, empresa 1 solo le debe mostrar proveedor 2 y proveedor 3 porque ya tiene proveedor 1 pero a la empresa 2 le deberia mostrar los 3 proveedores.

Es posible?

gracias de antemano gnzsoloyo, ya miro tu code gracias

edit///////////
leo_ no entiendo tu consulta soy reburro me la puedes explicar. gracias de antemano
  #5 (permalink)  
Antiguo 05/01/2012, 11:31
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Mejorar consulta

Hola Arsenal:

Si entendí correctamente, lo único que te falta es especifica en la consulta la empresa que estás consultando, tal como lo estás poniendo simplemente muestras los proveedores que no están asignados a ninguna empresa, para mostrar los proveedores que no están asignados a una empresa en específica sería más o menos así:

Código MySQL:
Ver original
  1. mysql> CREATE TABLE proveedores (id_proveedor INT, nombre VARCHAR(15));
  2. Query OK, 0 rows affected (0.16 sec)
  3.  
  4. mysql> INSERT INTO proveedores VALUES (1, 'proveedor 1'),
  5.     -> (2, 'proveedor 2'),(3, 'proveedor 3');
  6. Query OK, 3 rows affected (0.03 sec)
  7. Records: 3  Duplicates: 0  Warnings: 0
  8.  
  9. mysql> SELECT * FROM proveedores;
  10. +--------------+-------------+
  11. | id_proveedor | nombre      |
  12. +--------------+-------------+
  13. |            1 | proveedor 1 |
  14. |            2 | proveedor 2 |
  15. |            3 | proveedor 3 |
  16. +--------------+-------------+
  17. 3 rows in set (0.00 sec)
  18.  
  19. mysql> CREATE TABLE empresa_proveedor (id INT, id_empresa INT, id_proveedor INT)
  20. ;
  21. Query OK, 0 rows affected (0.09 sec)
  22.  
  23. mysql> INSERT INTO empresa_proveedor VALUES (1, 1, 1);
  24. Query OK, 1 row affected (0.03 sec)
  25.  
  26. mysql> SELECT * FROM empresa_proveedor;
  27. +------+------------+--------------+
  28. | id   | id_empresa | id_proveedor |
  29. +------+------------+--------------+
  30. |    1 |          1 |            1 |
  31. +------+------------+--------------+
  32. 1 row in set (0.00 sec)
  33.  
  34.  
  35. mysql> #utilizando RIGHT JOIN para la empresa 1
  36. mysql> SELECT p.id_proveedor,p.nombre
  37.     -> FROM empresa_proveedor ep RIGHT JOIN
  38.     -> proveedores p
  39.     -> ON ep.id_proveedor = p.id_proveedor AND ep.id_empresa = 1
  40.     -> WHERE ep.id_proveedor IS NULL;
  41. +--------------+-------------+
  42. | id_proveedor | nombre      |
  43. +--------------+-------------+
  44. |            2 | proveedor 2 |
  45. |            3 | proveedor 3 |
  46. +--------------+-------------+
  47. 2 rows in set (0.00 sec)
  48.  
  49. mysql> #utilizando RIGHT JOIN para la empresa 2
  50. mysql> SELECT p.id_proveedor,p.nombre
  51.     -> FROM empresa_proveedor ep RIGHT JOIN
  52.     -> proveedores p
  53.     -> ON ep.id_proveedor = p.id_proveedor AND ep.id_empresa = 2
  54.     -> WHERE ep.id_proveedor IS NULL;
  55. +--------------+-------------+
  56. | id_proveedor | nombre      |
  57. +--------------+-------------+
  58. |            1 | proveedor 1 |
  59. |            2 | proveedor 2 |
  60. |            3 | proveedor 3 |
  61. +--------------+-------------+
  62. 3 rows in set (0.00 sec)

Observa que lo único que hice fue agregar en el ON del JOIN la condición para filtrar sólo los registros para la empresa que estás consultando.

También podrías haberlo hecho utilizando NOT EXIST y NOT IN así:

Código MySQL:
Ver original
  1. mysql> #Utilizando NOT EXISTS
  2. mysql> SELECT * FROM proveedores p WHERE NOT EXISTS(
  3.     -> SELECT id_proveedor FROM empresa_proveedor ep
  4.     -> WHERE ep.id_proveedor = p.id_proveedor AND ep.id_empresa = 2);
  5. +--------------+-------------+
  6. | id_proveedor | nombre      |
  7. +--------------+-------------+
  8. |            1 | proveedor 1 |
  9. |            2 | proveedor 2 |
  10. |            3 | proveedor 3 |
  11. +--------------+-------------+
  12. 3 rows in set (0.00 sec)
  13.  
  14. mysql> #Utilizando NOT IN
  15. mysql> SELECT * FROM proveedores p WHERE id_proveedor NOT IN
  16.     -> (SELECT id_proveedor
  17.     -> FROM empresa_proveedor ep WHERE ep.id_empresa = 2);
  18. +--------------+-------------+
  19. | id_proveedor | nombre      |
  20. +--------------+-------------+
  21. |            1 | proveedor 1 |
  22. |            2 | proveedor 2 |
  23. |            3 | proveedor 3 |
  24. +--------------+-------------+
  25. 3 rows in set (0.00 sec)

Saludos y espero que esto sea lo que necesitas.
Leo
  #6 (permalink)  
Antiguo 05/01/2012, 11:40
Avatar de arsenal  
Fecha de Ingreso: agosto-2008
Mensajes: 65
Antigüedad: 15 años, 8 meses
Puntos: 2
Respuesta: Mejorar consulta

Andale leonardo_josue eso era lo que queria lograr :D:D:D muchisisisisimas gracias por su respuesta.

Olvide poner lo del id_empresa en mi post principal pero lo ponia en el WHERE y no me funcionaba así pero ya vi que se pone en el ON del JOIN

Nuevamente muchas gracias mi estimado

Saludos

Etiquetas: join, mejorar, registros, 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 06:54.