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

consulta entre tablas

Estas en el tema de consulta entre tablas en el foro de Mysql en Foros del Web. Hola gente, tengo una estructura simple de 2 tablas con relacion 1 a N Facturas ----------- fac_id fac_numero Remitos ---------- rem_id rem_numero fac_id nada del ...
  #1 (permalink)  
Antiguo 08/04/2014, 08:21
Avatar de Patriarka  
Fecha de Ingreso: enero-2011
Ubicación: Moreno, Buenos Aires, Argentina
Mensajes: 2.851
Antigüedad: 13 años, 3 meses
Puntos: 288
consulta entre tablas

Hola gente,
tengo una estructura simple de 2 tablas con relacion 1 a N

Facturas
-----------
fac_id
fac_numero

Remitos
----------
rem_id
rem_numero
fac_id

nada del otro mundo, le problema es que tengo que hacer una query
que pueda saber si una factura tiene remitos o no

es muy complicado? a mi no se ocurre como hacerlo directamente en mysql

gracias
  #2 (permalink)  
Antiguo 08/04/2014, 09:25
Avatar de andresgarciadev  
Fecha de Ingreso: junio-2013
Mensajes: 218
Antigüedad: 10 años, 10 meses
Puntos: 32
Respuesta: consulta entre tablas

Código MySQL:
Ver original
  1. SELECT count(*) FROM Remitos re INNER JOIN Facturas fa WHERE re.fac_id = fa.fac_id group by re.fac_id
no tengo donde probarlo pero algo asi no seria XD?
  #3 (permalink)  
Antiguo 08/04/2014, 09:41
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: consulta entre tablas

Hola Patriarka:

Cita:
es muy complicado? a mi no se ocurre como hacerlo directamente en mysql
Para nada, es una consulta nivel principiante de SQL... tienes muchísimas formas de hacerlo:

Con NOT EXISTS

Con NOT IN

Con LEFT JOIN

Aquí hay un buen artículo para que veas cuál de las opciones es la mejor.

NOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL: MySQL


Saludos
Leo.
  #4 (permalink)  
Antiguo 08/04/2014, 13:07
Avatar de Patriarka  
Fecha de Ingreso: enero-2011
Ubicación: Moreno, Buenos Aires, Argentina
Mensajes: 2.851
Antigüedad: 13 años, 3 meses
Puntos: 288
Respuesta: consulta entre tablas

Hola gracias por las respuestas,
ya lo resolvi con una subconsulta al estilo

select * from Factura F, Remito R
where (select count(subR.id) from Remito subR where R.rem_id = subR.rem_id) > 0;
  #5 (permalink)  
Antiguo 08/04/2014, 15:35
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: consulta entre tablas

Hola de nuevo Patriarka:

En lugar de utilizar alguna de las opciones que te puse arriba, elegiste una que es de entrara una barbaridad y la que peor desempeño tiene...

Vayamos por partes:

1. No es recomendable que en el FROM pongas las tablas que intervienen en una consulta separadas por comas (tal como lo haces):

Código:
...
from Factura F, Remito R
...
Esto de entrada está haciendo un PRODUCTO CARTESIANO, ya que en ningún lugar estás poniendo en el WHERE de qué manera están relacionadas estas tablas...

observa este ejemplo:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1;
  2. +------+-------------+
  3. | id   | descripcion |
  4. +------+-------------+
  5. |    1 | uno         |
  6. |    2 | dos         |
  7. |    3 | tres        |
  8. +------+-------------+
  9. 3 rows in set (0.00 sec)
  10.  
  11. mysql> SELECT * FROM tabla2;
  12. +------+-------------+
  13. | id   | descripcion |
  14. +------+-------------+
  15. |    1 | uno         |
  16. |    2 | dos         |
  17. |    4 | cuatro      |
  18. +------+-------------+
  19. 3 rows in set (0.00 sec)

Ahora bien, si quitas del WHERE la condición que colocaste, tienes algo como esto:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1, tabla2;
  2. +------+-------------+------+-------------+
  3. | id   | descripcion | id   | descripcion |
  4. +------+-------------+------+-------------+
  5. |    1 | uno         |    1 | uno         |
  6. |    2 | dos         |    1 | uno         |
  7. |    3 | tres        |    1 | uno         |
  8. |    1 | uno         |    2 | dos         |
  9. |    2 | dos         |    2 | dos         |
  10. |    3 | tres        |    2 | dos         |
  11. |    1 | uno         |    4 | cuatro      |
  12. |    2 | dos         |    4 | cuatro      |
  13. |    3 | tres        |    4 | cuatro      |
  14. +------+-------------+------+-------------+
  15. 9 rows in set (0.00 sec)

Esto es un producto cartesiano... Tu consulta es ineficiente porque antes de evaluar el WHERE interno, se realiza el producto que te menciono... Si te tomaste un tiempo para leer la última liga que te puse, de habrás dado cuenta que la mejor opción es hacerlo con un LEFT JOIN

Cita:
That's why the best way to search for missing values in MySQL is using a LEFT JOIN / IS NULL or NOT IN rather than NOT EXISTS.
En otras palabra, en lugar de tu consulta, lo que podrías hacer es algo como esto:

Código MySQL:
Ver original
  1. mysql> SELECT T1.* FROM tabla1 T1
  2.     -> LEFT JOIN tabla2 T2 ON T1.id = T2.id
  3.     -> WHERE T2.id IS NULL;
  4. +------+-------------+
  5. | id   | descripcion |
  6. +------+-------------+
  7. |    3 | tres        |
  8. +------+-------------+
  9. 1 row in set (0.00 sec)

es decir, de tu tabla1, el id=3 es el único que no existe en tu tabla2... Otra forma sería con el NOT IN:

Código MySQL:
Ver original
  1. mysql> SELECT T1.* FROM tabla1 T1
  2.     -> WHERE T1.id NOT IN (SELECT T2.id FROM tabla2 T2);
  3. +------+-------------+
  4. | id   | descripcion |
  5. +------+-------------+
  6. |    3 | tres        |
  7. +------+-------------+
  8. 1 row in set (0.00 sec)

Y también con el NOT EXISTS, que aunque es menos eficiente que los dos anteriores:

Código MySQL:
Ver original
  1. mysql> SELECT T1.* FROM tabla1 T1
  2.     -> WHERE NOT EXISTS ( SELECT T2.id FROM tabla2 T2
  3.     ->                    WHERE T1.id = T2.id);
  4. +------+-------------+
  5. | id   | descripcion |
  6. +------+-------------+
  7. |    3 | tres        |
  8. +------+-------------+
  9. 1 row in set (0.00 sec)

No sé, pero desde mi punto de vista tu consulta no sirve para lo que planteas de inicio, y si funcionara, te puedo apostar mi comida a que cualquiera de las tres consultas que pongo tendría un mejor rendimiento que la que propones.

Saludos
Leo

Etiquetas: sql, tabla, tablas
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 09:59.