select distinct y devolver todos los campos en mysql

243 views
Skip to first unread message

Jonathan Morales Salazar

unread,
Jul 30, 2014, 3:20:10 PM7/30/14
to programa...@googlegroups.com



Hola, necesito una ayuda con una consulta, ojalá me puedan colaborar, de antemano gracias.

Tengo la tabla de la imagen que guarda el historial de documentación subida por el usuario, supongamos que los documento_id correponden a los siguiente:
9   - rut
39 - hoja de vida
48 - factura

Necesito listarle al usuario los documentos que ha subido no repetidos, es decir, el que tenga fecha más reciente con respecto a cada documento_id (en la imagen correspondería a los primeros 4 registros) ¿cómo podría hacer la consulta? (No son importantes las relaciones)

--


Jonathan Morales Salazar
Ingeniero de Sistemas
www.blonder413.com

Jeison Varilla Mendoza

unread,
Jul 30, 2014, 4:21:50 PM7/30/14
to programa...@googlegroups.com

Hola.

Intente con algo asi

  1. SELECT fecha_leer
  2. FROM resultados
  3. GROUP BY fecha_leer
  4. ORDER BY fecha_leer DESC
  5. LIMIT 0,1;

O prueba con

SUpongamos que tiene cliente, documento, fecha, trata de que halla una hora seria genial pero tipo dataTime seria mejor.


SELECT id_cliente, docuemnto , Fecha, Hora
FROM documentos
GROUP BY id_cliente
ORDER BY Fecha DESC, Hora DESC

Eso deberia ser suficiente, si trae datos repetidos ya sabes usa el DISTINC y listo. Si aun no funciona tocara

con subconsultas.







--
--
Publicar: programa...@googlegroups.com
Anular suscripción: programando-an...@googlegroups.com
Webs: http://www.blonder413.com/ - http://www.cesarcancino.com/ - http://www.oscar-gomez.net/ - http://www.keyphercom.com/blog/

---
Has recibido este mensaje porque estás suscrito al grupo "Programando Ando" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a programando-an...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

César Cancino

unread,
Jul 30, 2014, 4:45:45 PM7/30/14
to programa...@googlegroups.com
Yo también diría que con group by se podría resolver eso....cualquier cosa me dices...

saludos
--
Atentamente Web Master César Cancino
          www.cesarcancino.com

Jonathan Morales Salazar

unread,
Jul 30, 2014, 7:10:14 PM7/30/14
to programa...@googlegroups.com
ya probé con group by pero no me ordena por fechacrea, de tal manera que no me sale el último documento subido. Si uso el distinct, lo único que pude hacer fue traer los id de los documentos y luego con un foreach buscar el último documento de ese id y guardarlo en un array, pero no puedo hacerlo en una sola consulta.

Probé con esto:

SELECT * FROM `documentocontratocomponente` group by documento_id order by fechacrea desc

p
ero me trae 25 registros, más de los que tiene la tabla.

si hago:

select distinct(documento_id) from documentocontratocomponente order by fechacrea desc

no puedo traer todos los campos

César Cancino

unread,
Jul 30, 2014, 9:12:55 PM7/30/14
to programa...@googlegroups.com
Podrías probar agregando un like al principio del campo documento_id...

me cuentas...saludos

Jonathan Morales Salazar

unread,
Jul 31, 2014, 10:22:30 AM7/31/14
to programa...@googlegroups.com
no entiendo, algo así?

SELECT * FROM `documentocontratocomponente` group by like documento_id order by fechacrea desc

César Cancino

unread,
Jul 31, 2014, 10:54:18 AM7/31/14
to programa...@googlegroups.com
si pero en el like apunta a los primeros caracteres del documento que deseas ordenar....con eso y un group by o un distinct creo, si es que te entendí, podrás resolverlo...


saludos

Jonathan Morales Salazar

unread,
Jul 31, 2014, 10:57:56 AM7/31/14
to programa...@googlegroups.com
la cuestión es que no puedo usar un like porque los id de los documentos son diferentes, sería difícil usar un like con un valor que puede ser cualquier número.

Daniel Carrero

unread,
Jul 31, 2014, 11:01:40 AM7/31/14
to programa...@googlegroups.com
Por que no creas la consulta con MySQL Workbench? o Navicat de manera que te aseguras que el resultado que obtienes es el que necesitas??

Saludos
Daniel Carrero Canales
+56974726453

Johan Alvarez

unread,
Jul 31, 2014, 11:11:25 AM7/31/14
to programa...@googlegroups.com
Hola, pues a mi me ha funcionado de la siguiente forma, aquí el script SQL para la creación de la tabla:

CREATE TABLE IF NOT EXISTS `documento` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `documento_id` int(11) NOT NULL,
  `componente_id` int(11) NOT NULL,
  `contrato_id` int(11) NOT NULL,
  `evidencia` varchar(200) NOT NULL,
  `usuariocrea` int(11) NOT NULL,
  `fechacreacion` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=16 ;

INSERT INTO `documento` (`id`, `documento_id`, `componente_id`, `contrato_id`, `evidencia`, `usuariocrea`, `fechacreacion`) VALUES
(1, 8, 34, 12, 'documento_34_contrato_12 2014-07-09 07:22:09.pdf', 45, '2014-07-09 07:22:09'),
(2, 23, 56, 34, 'documento_56_contrato_34 2014-07-08 06:10:13.pdf', 23, '2014-07-08 06:10:13'),
(3, 234, 23, 879, 'documento_23_contrato_879 2014-07-15 03:08:09.pdf', 45, '2014-07-15 03:08:09'),
(4, 56, 34, 23, 'documento_34_contrato_23 2014-07-15 04:09:32.pdf', 45, '2014-07-15 04:09:32'),
(5, 0, 12, 23, 'documento_12_contrato_23 2014-07-15 06:14:28.pdf', 56, '2014-07-15 06:14:28'),
(6, 65, 33, 23, 'documento_33_contrato_23 2014-07-09 12:34:38.pdf', 45, '2014-07-09 12:34:38'),
(7, 7, 5, 5, 'documento_5_contrato_5 2014-07-17 08:29:28.pdf', 43, '2014-07-17 08:29:28'),
(8, 34, 213, 12, 'documento_213_contrato_12 2014-07-16 06:17:12.pdf', 34, '2014-07-16 06:17:12'),
(9, 12, 56, 34, 'documento_56_contrato_34 2014-07-18 05:16:33.pdf', 567, '2014-07-18 05:16:33'),
(10, 7, 5, 5, 'documento_5_contrato_5 2014-07-19 11:41:40.pdf', 43, '2014-07-19 11:41:40'),
(11, 65, 33, 23, 'documento_33_contrato_23 2014-07-10 05:17:23.pdf', 45, '2014-07-10 05:17:23'),
(12, 0, 12, 23, 'documento_12_contrato_23 2014-07-02 17:30:48.pdf', 56, '2014-07-02 17:30:48'),
(13, 0, 12, 23, 'documento_12_contrato_23 2014-07-15 06:14:28.pdf', 56, '2014-07-15 06:14:28'),
(14, 234, 23, 879, 'documento_23_contrato_879 2014-07-15 08:42:44.pdf', 45, '2014-07-15 08:42:44'),
(15, 34, 213, 12, 'documento_213_contrato_12 2014-07-17 18:28:28.pdf', 34, '2014-07-17 18:28:28');


Aquí una imagen de como queda:



Aquí el script de la consulta:

SELECT DISTINCT (
concat( componente_id, contrato_id )
) AS documento, evidencia, max( fechacreacion )
FROM documento
GROUP BY documento
ORDER BY fechacreacion DESC
LIMIT 0 , 30


Aquí la imagen de los resultados que arroja:



​Por como está "construido" el campo evidencia entenderás por qué usé CONCAT( ... ), verdad?

Espero te funcione, y si no avisas por favor...

Buen día...

^_^

Jonathan Morales Salazar

unread,
Jul 31, 2014, 11:12:25 AM7/31/14
to programa...@googlegroups.com
uso workbench, pero no sé cómo hacer el filtro a cómo lo plantea, yo solo hago la consulta y verifico los resultados

Johan Alvarez

unread,
Jul 31, 2014, 11:21:21 AM7/31/14
to programa...@googlegroups.com
Te funcionó la idea mia blonder413?

Jonathan Morales Salazar

unread,
Jul 31, 2014, 11:31:17 AM7/31/14
to programa...@googlegroups.com
probé la siguiente consulta pero no me resulta:

SELECT DISTINCT (
concat( documento_id)
) AS documento, evidencia, max( fechacrea )
FROM documentocontratocomponente
where contrato_id = 127
GROUP BY documento_id
ORDER BY fechacrea desc;


No corresponden la evidencia, comparto la tabla por si alguien desea colaborar. Gracias.

documentocontratocomponente.sql

Daniel Carrero

unread,
Jul 31, 2014, 11:50:10 AM7/31/14
to programa...@googlegroups.com
Jonathan mira este screenshot con tu consulta, parece correcta.


Saludos

Johan Alvarez

unread,
Jul 31, 2014, 11:54:18 AM7/31/14
to programa...@googlegroups.com
Claro que no funciona, los requerimientos de tu consulta cambiaron, la consulta anterior valía para el problema inicial, creo que esta servirá para este nuevo problema...

SELECT DISTINCT (
evidencia
), max( fechacrea ) , contrato_id
FROM documentocontratocomponente
WHERE contrato_id =127
LIMIT 0 , 30


Aquí los resultado que me arroja...

Johan Alvarez

unread,
Jul 31, 2014, 11:59:36 AM7/31/14
to programa...@googlegroups.com
No son necesarios el "GROUP" ni el "ORDER BY", al tener un id de contrato específico es solo seleccionar la fecha máxima y listo...
Y ojo con el uso de "*", se aconseja solo los campos necesarios... ^_^

Jonathan Morales Salazar

unread,
Jul 31, 2014, 12:06:23 PM7/31/14
to programa...@googlegroups.com
Daniel, el documento_id 49 debería tomar el id 471, pero me está tomando el 464, por lo que no me sirve.

Johan, eso solo me devuelve un documento, pero como verá en la tabla del contrato 127 posee 4 (9,39,48,49), por lo que esa consulta tampoco es la que busco


El 31 de julio de 2014, 10:59, Johan Alvarez <lliro...@gmail.com> escribió:
No son necesarios el "GROUP" ni el "ORDER BY", al tener un id de contrato específico es solo seleccionar la fecha máxima y listo...
Y ojo con el uso de "*", se aconseja solo los campos necesarios... ^_^

--
--
Publicar: programa...@googlegroups.com
Anular suscripción: programando-an...@googlegroups.com
Webs: http://www.blonder413.com/ - http://www.cesarcancino.com/ - http://www.oscar-gomez.net/ - http://www.keyphercom.com/blog/

---
Has recibido este mensaje porque estás suscrito al grupo "Programando Ando" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a programando-an...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Johan Alvarez

unread,
Jul 31, 2014, 12:28:28 PM7/31/14
to programa...@googlegroups.com
Prueba con esto, creo que es como lo que indica Daniel, pero si no es así, por favor comenta que es exactamente lo que necesitas...

SELECT DISTINCT (
CONCAT( contrato_id, componente_id )
) AS contrato, evidencia, fechacrea

FROM documentocontratocomponente
WHERE contrato_id =127
GROUP BY contrato
ORDER BY fechacrea DESC
LIMIT 0 , 30

Johan Alvarez

unread,
Jul 31, 2014, 12:33:20 PM7/31/14
to programa...@googlegroups.com
Corrijo, esto debe ilustrar mejor...

SELECT DISTINCT (
CONCAT( contrato_id, componente_id )
) AS contrato, id, documento_id, componente_id, contrato_id, evidencia, max( fechacrea )
FROM documentocontratocomponente

WHERE contrato_id =127
GROUP BY contrato
ORDER BY fechacrea DESC
LIMIT 0 , 30



Jonathan Morales Salazar

unread,
Jul 31, 2014, 12:49:37 PM7/31/14
to programa...@googlegroups.com
el concat en realidad no lo necesito, la consulta parece funcionar, solo que tiene algunas inconsistencias que me pone a pensar: la fecha la está trayendo bien, pero no corresponde con el documento_id, es decir, me está trayendo el primero documento_id 49 pero con la fecha del último documento_id 49.


--
--
Publicar: programa...@googlegroups.com
Anular suscripción: programando-an...@googlegroups.com
Webs: http://www.blonder413.com/ - http://www.cesarcancino.com/ - http://www.oscar-gomez.net/ - http://www.keyphercom.com/blog/

---
Has recibido este mensaje porque estás suscrito al grupo "Programando Ando" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a programando-an...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Johan Alvarez

unread,
Jul 31, 2014, 1:10:44 PM7/31/14
to programa...@googlegroups.com
Me funciona así, pero no se si sea lo mas óptimo para este caso...

SELECT CONCAT( contrato_id, componente_id ) AS contrato, max( fechacrea ) , max( evidencia ) , id, documento_id, componente_id, contrato_id

Johan Alvarez

unread,
Jul 31, 2014, 1:46:20 PM7/31/14
to programa...@googlegroups.com
También presenta incoherencias así...

Jonathan Morales Salazar

unread,
Aug 1, 2014, 9:58:46 AM8/1/14
to programa...@googlegroups.com
al final tuve en cuenta las relaciones, esta fue la consulta que hice.

http://pastebin.com/8iYk3RjK

SELECT
                    `documentocontratocomponente`.`id`, `documentocontratocomponente`.`evidencia`, `documentocontratocomponente`.`usuariocrea`,
                    `documentocontratocomponente`.`fechacrea`,
                    `componente`.`componente`,
                    `documento`.`documento`
                    FROM `documentocontratocomponente`, `componente`, `documento`
                    WHERE
                    `documentocontratocomponente`.`id`in
                    (
                            SELECT
                            max(
                            `documentocontratocomponente`.`id`
                            )
                            FROM `documentocontratocomponente`
                            inner join `documento` on `documentocontratocomponente`.`documento_id` = `documento`.`id`
                            inner join `componente` on `documentocontratocomponente`.`componente_id` = `componente`.`id`
                            WHERE  `documentocontratocomponente`.`contrato_id` = $id
                            group by `componente`.`componente`
                    )
                    and
                    `documentocontratocomponente`.`componente_id` = `componente`.`id`
                    and
                    `documentocontratocomponente`.`documento_id` = `documento`.`id`
                    ;



El 31 de julio de 2014, 12:46, Johan Alvarez <lliro...@gmail.com> escribió:
También presenta incoherencias así...

--
--
Publicar: programa...@googlegroups.com
Anular suscripción: programando-an...@googlegroups.com
Webs: http://www.blonder413.com/ - http://www.cesarcancino.com/ - http://www.oscar-gomez.net/ - http://www.keyphercom.com/blog/

---
Has recibido este mensaje porque estás suscrito al grupo "Programando Ando" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a programando-an...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.
Reply all
Reply to author
Forward
0 new messages