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

[SOLUCIONADO] Seleccionar última repetición de registros de una tabla

Estas en el tema de Seleccionar última repetición de registros de una tabla en el foro de Mysql en Foros del Web. Hola, amigos. Tengo un problema intentando seleccionar los valores de una tabla en la cual hay un campo con N valores (distribuidos en N registros) ...
  #1 (permalink)  
Antiguo 02/06/2015, 18:09
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Seleccionar última repetición de registros de una tabla

Hola, amigos.

Tengo un problema intentando seleccionar los valores de una tabla en la cual hay un campo con N valores (distribuidos en N registros) que —por ende— pueden repetirse N veces. Lo que pretendo es seleccionar los registros que coincidan con la última vez que aparece cada uno de los valores repetidos en el campo en cuestión.

En realidad, esto terminará involucrando a dos tablas, por lo que empecé por una de ellas para ver cómo podría hacerlo. Paso a mostrar la conformación de ambas.

Código Tablas:
Ver original
  1. OBRAS               AVANCES
  2. id  nomb            id  id_ob   desc
  3.  1  ob-1             1    1     desc nro. 1 de ob-1
  4.  2  ob-2             2    3     desc nro. 1 de ob-3
  5.  3  ob-3             3    1     desc nro. 2 de ob-1
  6.  4  ob-4             4    2     desc nro. 1 de ob-2
  7.  5  ob-5             5    4     desc nro. 1 de ob-4
  8.                      6    2     desc nro. 2 de ob-2
  9.                      7    5     desc nro. 1 de ob-5
  10.                      8    1     desc nro. 3 de ob-1
  11.                      9    4     desc nro. 2 de ob-4
  12.                     10    5     desc nro. 2 de ob-5
  13.                     11    1     desc nro. 4 de ob-1
  14.                     12    3     desc nro. 2 de ob-3

Esas son las dos tablas que tengo. En realidad, hay más campos, pero por ahora solo muestro estos para no hacer más extensa la consulta.

El objetivo es tomar los registros de la tabla 'Obras' cuyos avances (registros de la tabla 'Avances') representen la última vez en que fueron guardados. En otras palabras, debería de obtener esto:

Código Objetivo:
Ver original
  1. id  nomb    desc
  2. 1   ob-1    desc nro. 4  <-- ID 11 en la tabla 'Avances'
  3. 2   ob-2    desc nro. 2  <-- ID 6 en la tabla 'Avances'
  4. 3   ob-3    desc nro. 2  <-- ID 12 en la tabla 'Avances'
  5. 4   ob-4    desc nro. 2  <-- ID 9 en la tabla 'Avances'
  6. 5   ob-5    desc nro. 2  <-- ID 10 en la tabla 'Avances'

Antes de hacer un JOIN, intenté tomar los registros finales de cada obra pero solo consultando en la tabla 'Avances', para lo cual hice esto:

Código MySQL:
Ver original
  1. SELECT DISTINCT id_ob FROM avances ORDER BY id DESC

Y, en efecto, obtuve los registros 3, 1, 5, 4 y 2, respectivamente. Justo en el orden en el que finalmente terminan ubicándose en la tabla 'Avances' (lo que correspondería a los id: 12, 11, 10, 9 y 6).

Luego, al intentar hacer la consulta con ambas tablas, es que se me presenta la complicación. Intenté usar un GROUP BY en la campo id_ob de la tabla avances, pero solo se agrupan los registros que aparecen por primera vez para cada obra y no los últimos.

Si alguien pudiera sugerirme otra forma de hacerlo para obtener los resultados que busco, se lo agradeceré mucho.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #2 (permalink)  
Antiguo 02/06/2015, 18:33
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Seleccionar última repetición de registros de una tabla

Código MySQL:
Ver original
  1. select * from obras as t1
  2. left join (select max(id) as id, id_ob from avances group by id_ob) as t2 on (t1.id=t2.id)
  3. left join avances as t3 on (t3.id=t2.id and t2.id_ob=t3.id_ob)

algo como eso :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 02/06/2015, 19:19
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Seleccionar última repetición de registros de una tabla

Hola, Libras.

No he logrado el resultado esperado, solo obtengo los registros de la tabla 'Obras' y todos los demás campos asociados pero con valores nulos. Sin embargo, me diste una idea.

Inicialmente creí que usando la función MAX(), solo obtendría el registro (y no "los") cuyo valor del campo indicado sea el mayor de la tabla y dado que se trata del id, pues, sería el último. Probando la subconsulta que hiciste, me di cuenta de que eso no es así y fue desde ahí que partí para hallar la solución.

La consulta definitiva es la siguiente:

Código MySQL:
Ver original
  1. SELECT a.id, a.nomb, MAX(b.id) AS av_id, MAX(b.desc)
  2. FROM obras a
  3. INNER JOIN avances b
  4. ON a.id = b.id_ob
  5. GROUP BY b.id_ob

De este modo, el resultado es el siguiente:

Código Resultado:
Ver original
  1. id  nomb    av_id    desc
  2. 1   ob-1       11    desc nro. 4 de ob-1
  3. 2   ob-2        6    desc nro. 2 de ob-2
  4. 3   ob-3       12    desc nro. 2 de ob-3
  5. 4   ob-4        9    desc nro. 2 de ob-4
  6. 5   ob-5       10    desc nro. 2 de ob-5

Gracias por la ayudada brindada, estimado Libras. Saludos.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Última edición por Alexis88; 04/08/2015 a las 20:53 Razón: Corrección

Etiquetas: join, repetidos, seleccion, 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 15:30.