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

Consultar a 2 tablas JOIN

Estas en el tema de Consultar a 2 tablas JOIN en el foro de Mysql en Foros del Web. Tengo una consulta a dos tablas: 1.- Tabla de artículos (almacena el nombre del artículo) 2.- Tabla de movimientos (almacena las salidas de piezas) Es ...
  #1 (permalink)  
Antiguo 13/07/2011, 12:51
 
Fecha de Ingreso: enero-2002
Mensajes: 1.174
Antigüedad: 22 años, 3 meses
Puntos: 21
Consultar a 2 tablas JOIN

Tengo una consulta a dos tablas:

1.- Tabla de artículos (almacena el nombre del artículo)
2.- Tabla de movimientos (almacena las salidas de piezas)

Es normal que un artículo pueda tener varios movimientos de salida.

Deseo generar una consulta con la relación de artículos e incluir el primer movimiento de salida almacenado.

Hice la siguiente consulta, pero mi problema es que se incluyen todos los registros de movimientos y yo deseo solo mostrar el primer registro de movimiento que se tiene almacenado.

Código MySQL:
Ver original
  1. $consulta = mysql_query("SELECT a.codigo, a.descripcion, m.codigo, m.fecha, m.cantidad
  2.     FROM articulos a
  3.     LEFT JOIN movimientos m on a.codigo=m.codigo
  4.     ", $link) or die ("No se pudo ejecutar la consulta");

Que debo hacer?
Gracias por su ayuda.
  #2 (permalink)  
Antiguo 13/07/2011, 13:30
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Consultar a 2 tablas JOIN

Hola Bier:

Olvidaste mencionar cuál es la estructura de tus tablas, qué campos son llaves y sobre todo el criterio para determinar cuál es el primer movimiento (supongo que será por fecha, pero eso deberías decirlo tú.

En el foro hay muchos ejemplos que pudiera ayudarte, la idea generalmente es la misma, utilizando MIN o MAX (para el primero o el último) y agregarlo como un INNER JOIN adicional, más o menos así:

Código MySQL:
Ver original
  1. mysql> create table TablaA (id_a int, descripcion varchar(20));
  2. Query OK, 0 rows affected (0.25 sec)
  3.  
  4. mysql> insert into TablaA values (1, 'uno'), (2, 'dos'), (3, 'tres');
  5. Query OK, 3 rows affected (0.08 sec)
  6. Records: 3  Duplicates: 0  Warnings: 0
  7.  
  8. mysql> select * from TablaA;
  9. +------+-------------+
  10. | id_a | descripcion |
  11. +------+-------------+
  12. |    1 | uno         |
  13. |    2 | dos         |
  14. |    3 | tres        |
  15. +------+-------------+
  16. 3 rows in set (0.00 sec)
  17.  
  18. mysql> create table TablaB (id_b int, id_a int, fecha date);
  19. Query OK, 0 rows affected (0.06 sec)
  20.  
  21. mysql> insert into TablaB values (1, 1, '2011-03-01'), (2, 1, '2011-01-02'),
  22.     -> (3, 1, '2011-01-01'), (4, 2, '2011-03-04'), (5, 2, '2011-03-05'),
  23.     -> (6, 3, '2011-07-13');
  24. Query OK, 6 rows affected (0.03 sec)
  25. Records: 6  Duplicates: 0  Warnings: 0
  26.  
  27. mysql> select * from TablaB
  28. +------+------+------------+
  29. | id_b | id_a | fecha      |
  30. +------+------+------------+
  31. |    1 |    1 | 2011-03-01 |
  32. |    2 |    1 | 2011-01-02 |
  33. |    3 |    1 | 2011-01-01 |
  34. |    4 |    2 | 2011-03-04 |
  35. |    5 |    2 | 2011-03-05 |
  36. |    6 |    3 | 2011-07-13 |
  37. +------+------+------------+
  38. 6 rows in set (0.00 sec)
  39.  
  40. mysql> select A.*, B.* from TablaA A
  41.     -> inner join TablaB B on A.id_a = B.id_a
  42.     -> inner join
  43.     -> (
  44.     -> select id_a, min(fecha) min_fecha from TablaB group by id_a
  45.     -> ) C
  46.     -> on B.id_a = C.id_a and B.fecha = C.min_fecha;
  47. +------+-------------+------+------+------------+
  48. | id_a | descripcion | id_b | id_a | fecha      |
  49. +------+-------------+------+------+------------+
  50. |    1 | uno         |    3 |    1 | 2011-01-01 |
  51. |    2 | dos         |    4 |    2 | 2011-03-04 |
  52. |    3 | tres        |    6 |    3 | 2011-07-13 |
  53. +------+-------------+------+------+------------+
  54. 3 rows in set (0.00 sec)

Observa que aunque los registros 1 y 2 de la TablaA tienen mas de un registro asociado en la TablaB sólo se está mostrando el primero (de acuerdo a la fecha)

Dale un vistazo a ver si te sirve y si continuas con problemas aclara los puntos que puse al inicio y si es posible pon algunos datos de ejemplo. También podrías poner algo del código que intentaste hacer para ayudarte a afinar la sentencia.

Saludos
Leo.
  #3 (permalink)  
Antiguo 13/07/2011, 20:41
 
Fecha de Ingreso: enero-2002
Mensajes: 1.174
Antigüedad: 22 años, 3 meses
Puntos: 21
Respuesta: Consultar a 2 tablas JOIN

Estimado Leo,

El ejemplo que pusiste es exactamente el planteamiento a mi necesidad.

Debo analizar la siguiente instrucción:

Código MySQL:
Ver original
  1. mysql> SELECT A.*, B.* FROM TablaA A
  2.     -> INNER JOIN TablaB B on A.id_a = B.id_a
  3.     -> INNER JOIN
  4.     -> (
  5.     -> SELECT id_a, min(fecha) min_fecha FROM TablaB GROUP BY id_a
  6.     -> ) C
  7.     -> on B.id_a = C.id_a AND B.fecha = C.min_fecha;

Mi instrucción actual es:

Código MySQL:
Ver original
  1. SELECT A.id_a , A.descripcion, B.id_a, B.fecha, B.cantidad
  2. FROM articulos A
  3. LEFT JOIN movimientos B on A.id_a = B.id_a

No debo basarme en la fecha para identificar al primer registro, ya que en algunos casos un artículo puede tener varios registros un artículo con la misma fecha, por ello debo tomar: B.id_a

Deberé estudiar la instrucción que me suguieres (la cual veo muy larga "grande")

Gracias por tu ayuda.

Bier
  #4 (permalink)  
Antiguo 14/07/2011, 07:48
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Consultar a 2 tablas JOIN

Hola de nuevo Bier:

Estudia un poco la consulta, puedes ejecutar la subconsulta donde obtengo el MIN para que te ayude a entender mejor cómo es que se está filtrando la información. El uso del LEFT JOIN o INNER JOIN, depende de tu lógica de negocio, creo que lo haces para mostrar también aquellos artículos que no tengan ningún movimiento, por lo que también el otro JOIN sería del tipo LEFT. Si tienes problema para entender algún punto de la consulta lo comentas en el foro y con gusto tratamos de ayudarte.

Saludos
Leo.
  #5 (permalink)  
Antiguo 14/07/2011, 08:42
Avatar de eliza_ralves  
Fecha de Ingreso: junio-2009
Ubicación: Caracas
Mensajes: 126
Antigüedad: 14 años, 10 meses
Puntos: 2
Exclamación Respuesta: Consultar a 2 tablas JOIN

Hola! Tengo un problema parecido y escribo aqui para ver si entre los dos me pueden ayudar:

Resulta que necesito hacer dos consultas en una, y como lo estan haciendo con inner join me gustaria saber como seria adaptar estas dos consultas en una. La consulta general que quiero hacer es sumar las horas de los empleados que participan en un proyecto, pero para ello, primero consulte todos los empleados que pertenecen a una disciplina y oficina. Luego tomo en una variable (donde se encuentran todos los codigos) y luego hago otra consulta (casi hago el mismo filtro :( ) pero incluyendo la condición que el código del empleado que obtuve en la primera consulta me lo compare con el codigo del empleado de la tabla PARTICIPA.

aqui las dos consultas:

query1 = "SELECT Codigo
FROM dbo.SPO2_Empleado
WHERE Nombre_Disciplina = '" . $dis_select . "'
AND Codigo_Oficina = '" . $ofic_select . "' ";

query2 = "SELECT SUM(PA.Cantidad_Horas)Horas
FROM dbo.SPO2_Participa PA, dbo.SPO2_Empleado EM, dbo.SPO2_Proyecto P
WHERE PA.Codigo_Empleado = '" . $codigo_Empleado . "'
AND P.Codigo = PA.Codigo_Evento
AND EM.Nombre_Disciplina = '" . $dis_select . "'
AND EM.Codigo_Oficina = '" . $ofic_select . "'
Group by PA.Codigo_Empleado";

mi pregunta es: cómo adaptarlo para utilizar inner join, porque como tengo que comparar otras cosas antes en distintas tablas.....

espero me puedan ayudar, y disculpen si este tema en particular no es una respuesta a la pregunta inicial de Bier.
__________________
“El mayor enemigo del conocimiento no es la ignorancia, sino la ilusión del conocimiento”— Stephen Hawking

Última edición por eliza_ralves; 14/07/2011 a las 08:55
  #6 (permalink)  
Antiguo 14/07/2011, 09:12
Avatar de eliza_ralves  
Fecha de Ingreso: junio-2009
Ubicación: Caracas
Mensajes: 126
Antigüedad: 14 años, 10 meses
Puntos: 2
Respuesta: Consultar a 2 tablas JOIN

leonardo_josue sería asi?

query = SELECT SUM(PA.Cantidad_Horas)Horas
from dbo.SPO2_Participa PA
INNER JOIN dbo.SPO2_Proyecto P
on PA.Codigo= P.Codigo
and (SELECT Codigo
FROM dbo.SPO2_Empleado
WHERE Nombre_Disciplina = 'Tuberías'
AND Codigo_Oficina = 'V') = PA.Codigo_Empleado
__________________
“El mayor enemigo del conocimiento no es la ignorancia, sino la ilusión del conocimiento”— Stephen Hawking

Última edición por eliza_ralves; 14/07/2011 a las 10:04
  #7 (permalink)  
Antiguo 14/07/2011, 11:04
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Consultar a 2 tablas JOIN

Hola eliza_ralves:

No es correcto que utilices un tema abierto para expresar una nueva pregunta, pero veo que ya abriste tu propio tema, así es que te contesto en el otro para ver si te puede servir el código.

Saludos
leo.

Etiquetas: consultar, join, query, registros, select, 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 11:04.