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

Sacar el maximo Id de varios campos

Estas en el tema de Sacar el maximo Id de varios campos en el foro de Mysql en Foros del Web. Hola mi pregunta es la siguiente: tengo una tabla de esta Forma: id-Plano-proveedor-rev 1 - 3506 - Abb - 0 2 - 3506 - Abb ...
  #1 (permalink)  
Antiguo 27/07/2010, 12:07
 
Fecha de Ingreso: junio-2010
Mensajes: 43
Antigüedad: 13 años, 10 meses
Puntos: 0
Sacar el maximo Id de varios campos

Hola mi pregunta es la siguiente:
tengo una tabla de esta Forma:
id-Plano-proveedor-rev
1 - 3506 - Abb - 0
2 - 3506 - Abb - 1
3 - 4522 - Abb - 0
4 - 4522 - Abb - 1

quiero sacar atravez del proveedor el numero de plano con el maximo id.
osea en este caso el 2 - 3506 - Abb - 1 y 4 - 4522 - Abb - 1

desde ya muchas gracias
  #2 (permalink)  
Antiguo 27/07/2010, 12:59
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Sacar el maximo Id de varios campos

SELECT t1.id, t1.Plano, t1.proveedor, t1.rev FROM (SELECT id, Plano, proveedor, rev FROM tutabla ORDER BY Plano, id)t1 GROUP BY t1.Plano
  #3 (permalink)  
Antiguo 28/07/2010, 00:14
 
Fecha de Ingreso: julio-2010
Mensajes: 10
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Sacar el maximo Id de varios campos

Buenas. Creo tener exactamente la misma duda. Recién comienzo con MySQL y ya le di bastantes vueltas al asunto sin obtener lo que buscaba, así que agradecería una mano :P

La respuesta dada no da el máximo, da el primero que aparece, que en este caso es las rev 0, no las 1 como se pidió. Además, ya de ver
(SELECT id, Plano, proveedor, rev FROM tutabla ORDER BY Plano, id)
Se ve que se obtiene directamente la tabla que ya se tenía :P

No dudo de todas formas de que por algo similar se pueda obtener, pero me parece que es mucha consulta (un select dentro del otro) y espero poder obtenerlo sin necesidad de eso.

Estube intentando con algo así como:
SELECT id, Plano, proveedor, rev
FROM prueba GROUP BY Plano HAVING MAX(rev)
Pero obtengo:
id Plano proveedor rev
1 3506 Abb 0
3 4522 Abb 0

Con
SELECT id, Plano, proveedor, MAX(rev)
FROM prueba GROUP BY Plano HAVING MAX(rev)
Obtengo
id Plano proveedor MAX(rev)
1 3506 Abb 1
3 4522 Abb 1

Que sigue sin ser lo buscado, ya que si bien las revisiones son las máximas, los ID no son 2 y 4 como se buscaba, sino los viejos 1 y 3.

La pregunta sería, ¿Alguien sabe como con el HAVING y el MAX(rev), hacer que los demás campos buscados del select se correspondan?

Particularmente mi problema, es obtener algo como lo que se pregunta al principio de este topic (por eso lo reutilizo, para ver si nos podemos sacar las dudas los 2), pero de una manera óptima a nivel performance (tiempo), y usar subconsultas no me parece lo mejor.

Salu2 y grax de antemano.
  #4 (permalink)  
Antiguo 28/07/2010, 00:38
 
Fecha de Ingreso: julio-2010
Mensajes: 10
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Sacar el maximo Id de varios campos

Probe

SELECT t1.id, t1.Plano, t1.proveedor, t1.rev FROM (SELECT id, Plano, proveedor, rev FROM prueba ORDER BY Plano , id DESC) t1 GROUP BY t1.Plano

Y si se llega a lo buscado (la diferencia es que ordena la subconsulta en orden descendente), pero me gustaría saber si se puede sin la subconsulta, haciendo quiza uso del HAVING.

Salu2
  #5 (permalink)  
Antiguo 28/07/2010, 00:46
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Sacar el maximo Id de varios campos

Lo del order es fácil de resolver.
SELECT t1.id, t1.Plano, t1.proveedor, t1.rev FROM (SELECT id, Plano, proveedor, rev FROM prueba ORDER BY Plano , id DESC) t1 GROUP BY t1.Plano ORDER BY t1.id ASC
Respecto a la posibilidad de hacerlo sin subconsulta, creo que no es posible, aunque también puede lograrse con varios INNER JOIN, uniendo tablas con ese SELECT del paréntesis.
  #6 (permalink)  
Antiguo 28/07/2010, 05:15
 
Fecha de Ingreso: julio-2010
Mensajes: 10
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Sacar el maximo Id de varios campos

Gracias Jurena. Alguien mas tiene una idea? Repito que soy muy nuevo en mysql, pero me resulta raro que con las opciones que prove de usar el HAVING no se pueda lograr. Mas que nada porque entonces usar GROUP BY + HAVING lleva a grandes mentiras :P O sea, yo intente:

Cita:
Con
SELECT id, Plano, proveedor, MAX(rev)
FROM prueba GROUP BY Plano HAVING MAX(rev)
Obtengo
id Plano proveedor MAX(rev)
1 3506 Abb 1
3 4522 Abb 1
Y de mirar la tabla resultante se ve una tabla erronea, ya que no existe en la original filas con por ej id 1 y rev1, ni id 3 cin rev1. O sea, de la consulta, llegue a armar una tabla que es una mentira. Entonces, el GROUP BY + HAVING me parecen de un uso muy acotado. Alguien me puede orientar en este tema?

Grax.
  #7 (permalink)  
Antiguo 28/07/2010, 05:33
 
Fecha de Ingreso: junio-2010
Mensajes: 43
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Sacar el maximo Id de varios campos

Muchas gracias!!! probe con:

SELECT t1.id, t1.Plano, t1.proveedor, t1.rev FROM (SELECT id, Plano, proveedor, rev FROM prueba ORDER BY Plano , id DESC) t1 GROUP BY t1.Plano

y funciono de diez!!!!!!!
  #8 (permalink)  
Antiguo 28/07/2010, 05:46
 
Fecha de Ingreso: julio-2010
Mensajes: 10
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Sacar el maximo Id de varios campos

Buenisimo

Lo que me gustaría es que no figure como SOLUCIONADO hasta avanzar en mi consulta sobre hacerlo con GROUP BY y HAVING, pensando en q tiene más performance que usar subconsulta.

Igual, si uso sobconsulta y la subconsulta en sí usa JOIN entre varias tablas, como hago hago para referenciar externamente (en la consulta superior q quiero hacer) los campos de la consulta?

Me explico: si en la subconsulta hubiera tenido un campo x.id y a la tabla de esta consulta la llame como en el ejemplo t1, desde el otro select no puedo hacer t1.x.id (va, lo probe y me tiro error XD).

Encontrar como hacer esto mejoraria un poco el estado en el q se encuentra mi aplicación respecto a tiempos :P

Salu2
  #9 (permalink)  
Antiguo 28/07/2010, 05:50
 
Fecha de Ingreso: junio-2010
Mensajes: 43
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Sacar el maximo Id de varios campos

Cita:
Iniciado por arguerof Ver Mensaje
Muchas gracias!!! probe con:

SELECT t1.id, t1.Plano, t1.proveedor, t1.rev FROM (SELECT id, Plano, proveedor, rev FROM prueba ORDER BY Plano , id DESC) t1 GROUP BY t1.Plano

y funciono de diez!!!!!!!

Última edición por arguerof; 28/07/2010 a las 06:06 Razón: solucionado
  #10 (permalink)  
Antiguo 28/07/2010, 11:36
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Sacar el maximo Id de varios campos

driverram,
aplaudo tu interés y empeño en sacar la consulta de otro modo. Pero piensa en lo que ocurre cuando utilizas el HAVING. El HAVINg depende de un group by, y siempre es el resultado del mismo; pero cuando aplicas un group by sin ordenar previamente te muestra sólo un registro de cada dato y es además el primer almacenado, con lo que de poco te sirve. Te toca ordenar primero y luego hacer el group by valor (lo que yo he hecho), o hacer un SELECT valor, MAX(rev) maximo FROM tabla y luego mediante un inner join (subconsulta al fin y al cabo) relacionar el valor y el alias maximo
Un ejemplo ficticio
SELECT id, valor, rev FROM tutabla INNER JOIN (SELECT valor, MAX(rev) maximo FROM tutabla) t1 ON tutabla.valor = t1. valor AND tutabla.rev = t1.maximo

Esto, creo, también podría valer, pero quizás sea más rápido lo otro que te propuse. No estoy seguro de que no se pueda hacer algo con HAVING (quizás algún post de huesos52 ofreció una solución como la que tú buscas). Lo pensaré y si recuerdo la consulta o el post, lo pondré aquí.
  #11 (permalink)  
Antiguo 28/07/2010, 11:52
 
Fecha de Ingreso: julio-2010
Mensajes: 10
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Sacar el maximo Id de varios campos

Gracias Jurena.

Como comente, hace poco que estoy con mysql así que se me pueden escapar varias cosas :P. Lo que sí, me gusta optimizar de por sí, pero en este caso, lo necesito, porque lo que estoy desarrollando va a correr en una máquina algo lenta y se persive la tardanza :P.

Ni bien pueda pruebo de la forma que me indicaste. Sería buenisimo si encontras lo que comentas que explico otro usuario. Seguramente hay alguna consulta similar a lo que busco, pero no lo encontré y habiendo tantos temas, se dificulta :P

Grax.
  #12 (permalink)  
Antiguo 30/07/2010, 09:21
 
Fecha de Ingreso: julio-2010
Mensajes: 10
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Sacar el maximo Id de varios campos

Bueno, no quiero dar por muerto el tema sin sacarle todo el jugo.

Lo de ordenarla primero descendentemente y dsp hacer el group sirve, pero creo que se puede optimizar más, además, todavía no encontré como hacerlo cuando lo que ordeno es una consulta con JOIN (lo que expuse en uno de los mensajes anteriores, de que si dentro de esta consulta con join ya llamo a las cosas por ej x.id, dsp a la tabla ordenada la llamo t1, no me deja hacer t1.x.id XD).

No me cierra del todo lo del group si no me deja sacar lo que busco. O sea:

Si es solo por agrupar, porq no usar DISTINCT? eso agrupa tmb. Alguien puede decir porq agrupando y haciendo HAVING, puedo por ej sacar el max ID. Pero es muchas veces no sirve, o no alcanza, como en mi caso. Hago un ejemplo mundano de cuando no sirve solo tener un máximo? suponganse q controlan la temperatura de calderas. Hacen un sistema para q indique la max temperatura, joya, lo logran. Ven q la temp. supera la máxima... y cual es la caldera si solo tienen el máximo? necesitan saber la caldera para poder hacer algo, solo la info. de q hay un máximo no alcanza. Bueno, aca me pasa lo mismo, consigo el max id, pero no la info. asociada y entonces no me sirve. No digo q nunca sirva solo el máximo, pero muchas veces no y me parece curioso q no se puede hacer lo q quiero con GROUP BY y HAVING.

Si alguno tiene aportes o comentarios, adelante :P

Salu2

Etiquetas: campos, maximo
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 19:49.