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

Seleccionar el registro con el mayor valor en un campo ???

Estas en el tema de Seleccionar el registro con el mayor valor en un campo ??? en el foro de Mysql en Foros del Web. Teniendo la tabla ejemplo: Código: nombre posicion juan 1 pedro 8 andres 3 ¿Como puedo hacer una consulta para obtener el registro que tenga el ...
  #1 (permalink)  
Antiguo 11/12/2008, 13:22
Avatar de qvixote  
Fecha de Ingreso: marzo-2008
Mensajes: 79
Antigüedad: 11 años, 9 meses
Puntos: 2
Seleccionar el registro con el mayor valor en un campo ???

Teniendo la tabla ejemplo:

Código:
nombre  posicion
juan    1
pedro   8
andres  3
¿Como puedo hacer una consulta para obtener el registro que tenga el mayor valor numérico en el campo `posicion` ? ¿Qué debo poner en el WHERE?

Gracias de antemano.
  #2 (permalink)  
Antiguo 11/12/2008, 13:26
 
Fecha de Ingreso: noviembre-2008
Ubicación: San Vicente (Alicante)
Mensajes: 21
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: Seleccionar el registro con el mayor valor en un campo ???

where posicion=MAX(posicion)

no será así exactamente, pero por ahí van los tiros.
  #3 (permalink)  
Antiguo 11/12/2008, 13:58
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 11 años, 9 meses
Puntos: 300
Respuesta: Seleccionar el registro con el mayor valor en un campo ???

Inténtalo así, si no te funciona eso:

Código sql:
Ver original
  1. SELECT t.campo1, t.campovalor
  2. FROM tabla t
  3. WHERE t.campovalor = (
  4. SELECT MAX( campovalor )  FROM tabla)
  #4 (permalink)  
Antiguo 11/12/2008, 14:03
Avatar de masterojitos  
Fecha de Ingreso: julio-2008
Ubicación: Lima Callao Chucuito
Mensajes: 1.931
Antigüedad: 11 años, 5 meses
Puntos: 105
Respuesta: Seleccionar el registro con el mayor valor en un campo ???

hay varias formas de hacer ello:

LA MÀS INDICADA:
1. select nombre from tabla order by posicion asc limit 0,1


LA MENOS INDICADA
2. select nombre from tabla where posicion=(select posicion from tabla order by posicion asc limit 0,1
)


ALTERNATIVA
3. select nombre from tabla where posicion=(select max(posicion) from tabla)


suerte.
__________________
Atte. MasterOjitos :ojotes:
Todo sobre Programación Web
Las ultimas tendencias en Efectos y Recursos Web: MasterOjitos Blog
  #5 (permalink)  
Antiguo 11/12/2008, 14:31
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 11 años, 9 meses
Puntos: 300
Respuesta: Seleccionar el registro con el mayor valor en un campo ???

Masterojitos:
Cita:
LA MÀS INDICADA:
1. select nombre from tabla order by posicion asc limit 0,1
Esta es la más rápida y eficiente, pero tiene un inconveniente. Imaginemos que dos tienen el valor máximo. Sólo mostraría el primero. De ahí mi recomendación, con la que podrá traerse todos los registros que tengan el máximo...
  #6 (permalink)  
Antiguo 12/12/2008, 04:35
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.322
Antigüedad: 12 años, 1 mes
Puntos: 2654
Respuesta: Seleccionar el registro con el mayor valor en un campo ???

En realidad, si hicieras esto:
Código sql:
Ver original
  1. SELECT nombre, MAX(posicion) posicion
  2. FROM tabla;

Te debería devolver un sólo registro, si el valor de posicion no se repite.
Si lo que quieres es obtener un sólo valor, la cosa sería algo así:

Código sql:
Ver original
  1. SELECT nombre
  2. FROM (SELECT nombre, MAX(posicion) posicion
  3.           FROM tabla) Tabla1;

El uso de LIMIT es innecesario cuando buscas el mayor de un valor en un campo, si ese valor no puede repetirse. Si posición se repitiese, la forma más simple sería:
Código sql:
Ver original
  1. SELECT nombre
  2. FROM (SELECT nombre, MAX(posicion) posicion
  3.           FROM tabla) Tabla1
  4. GROUP BY posicion;
Ya que al estar trabajando con subconsultas, en la consulta posicion pasa a ser nombre de un campo y no alias de una función agregada (no se puede poner en la subconsulta porque violaría la restricción de funciones agregadas en el GROUP BY).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 12/12/2008, 08:25
Avatar de qvixote  
Fecha de Ingreso: marzo-2008
Mensajes: 79
Antigüedad: 11 años, 9 meses
Puntos: 2
Respuesta: Seleccionar el registro con el mayor valor en un campo ???

Wow, muchas respuestas, creo que tengo mucho que probar a ver si alguna me resulta. Les agradezco mucho a todos y les contaré cómo me va.

De cualquier forma, tendré que adaptar las respuestas a mi caso real, pues el que expuse era un ejemplo simple. Si me quieren ayudar, les expongo el caso real:

Tengo una tabla llamada `egresados`, donde están los datos personales de los egresados de un colegio. Tengo otra tabla que se llama `practicas`, donde se registran los procesos de practicas de cada egresado. Cada egresado puede tener más de un proceso de práctica registrado en la segunda tabla.

Tengo una consulta que lista todos los datos de los `egresados`:

Código:
SELECT `egresados`.* FROM `egresados` WHERE 1
para cando los quiero listar todos, y a veces algo así como

Código:
SELECT `egresados`.* FROM `egresados` WHERE `egresados`.`nombre` LIKE '%juan%'
para cuando hago búsquedas. Lo que me interesa lograr es que junto a esos datos, por medio de un LEFT JOIN, pueda además consultar los campos de la tabla `practicas`...

Código:
SELECT `egresados`.*, `practicas`.* FROM `egresados` 
LEFT JOIN `practicas` ON `egresados`.`user_id` = `practicas`.`user_id`
WHERE `egresados`.`nombre` LIKE '%juan%'
... pero el problema es que hay más de un registro en `practicas` para cada usuario, y yo necesito sólo el que tenga el mayor valor en el campo `uid` para cada usuario. Con la consulta anterior me muestra más de un registro por usuario, pero yo sólo quiero que muestre uno.

¿Alguien sabe cómo?

Gracias otra vez, y gracias de antemano para los que puedan responder otra vez.
  #8 (permalink)  
Antiguo 12/12/2008, 08:50
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.322
Antigüedad: 12 años, 1 mes
Puntos: 2654
Respuesta: Seleccionar el registro con el mayor valor en un campo ???

Código sql:
Ver original
  1. SELECT *
  2. FROM (
  3.     SELECT `egresados`.*, `practicas`.*
  4.     FROM `egresados`
  5.         LEFT JOIN `practicas` ON `egresados`.`user_id` = `practicas`.`user_id`
  6.     WHERE `egresados`.`nombre` LIKE '%juan%'
  7.     ORDER BY `practicas`.`uid` DESC) TablaTemp
  8. GROUP BY `user_id`;
Estoy suponiendo que `uid`es un campo de la tabla `prácticas`, cosa que no has aclarado.
Esta forma no es la más eficiente, pero puede ser muy efectiva. La más eficiente puede requerir un tercer nivel de consulta o un filtro más fino en el WHERE de la primera subconsulta.
Como detalle adicional, asegúrate de realmente necesitar todos los campos, porque estás usando tabla.*, lo que es la forma más ineficiente de consulta. SI no necesitas TODOS los campos de ambas tablas, mejor indica qué campos de cada tabla vas a usar. Traer todos, es traer basura que exige tiempo de TX perdido.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 12/12/2008, 09:34
Avatar de qvixote  
Fecha de Ingreso: marzo-2008
Mensajes: 79
Antigüedad: 11 años, 9 meses
Puntos: 2
Respuesta: Seleccionar el registro con el mayor valor en un campo ???

¡Gracias!

Supones bien lo del campo `uid`, es un campo de la tabla `practicas`. Realmente necesito todos los campos de la tabla `egresados`, por eso el *, pero no necesito todos los de `practicas`, por lo que en mi consulta real no pongo el *, lo puse acá para no escribir todos los campos que necesitaba, gracias por el consejo.

Probé tu solución y me funciona muy bien, al parecer. Lo que me intriga es que no sé por qué funciona, y eso es debido a que desconozco cómo funciona GROUP BY. ¿Me explicarías en algunas pocas palabras de qué se trata o me darías una URL donde pueda leer sobre GROUP BY?

Repito mi agradecimiento a todos los que aportan en los foros y nos salvan cuando lo necesitamos.
  #10 (permalink)  
Antiguo 12/12/2008, 10:47
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.322
Antigüedad: 12 años, 1 mes
Puntos: 2654
Respuesta: Seleccionar el registro con el mayor valor en un campo ???

En realidad el uso más utilizado de un GROUP GY se da en cálculos estadísticos y reportes de diverso tipo. Es en esos casos donde mejor se ve el efecto. Yo personalmente lo uso también para normalizar algunos datos de las tablas que vienen con info muy mal procesada.
El funcionamiento básico es simple: devuelve sólo el primer registro por cada conjunto agrupado donde los valores del conjunto se repitan. Esto es:
Si tienes estos valores:
Cita:
A B C E F G
-------------
1 2 3 4 5 6
1 1 3 4 5 6
1 3 3 4 5 6
1 3 2 1 5 6
Si agrupamos por A y C nos devuelve:
Cita:
A B C E F G
-------------
1 2 3 4 5 6
1 3 2 1 5 6
Si agrupamos por A y B:
Cita:
A B C E F G
-------------
1 2 3 4 5 6
1 3 2 1 5 6
y si agrupamos por E, F y G:
Cita:
A B C E F G
-------------
1 2 3 4 5 6
¿Se comprende?
Esto permite definir en el conjunto de agrupamiento un modo de clave alternativa que permita reunir en un sólo registro todos los que comparten alguna cualidad o valor. Eso también nos permite hacer que con el resto de los campos (no incluidos en el agrupamiento) se puedan realizar cálculos como cálculos de media -AVG()-, subtotales -SUM()-, máximos, mínimos, cálculos matemáticos, logarítmicos, trigonométricos, etc.

Supongamos sumar los subtotales de ventas diarios y la media de cada factura, de un mes:

Código sql:
Ver original
  1. SELECT fecha, SUM(importe) TotalVenta, AVG(importe) VentaMedia
  2. FROM facturas
  3. WHERE MONTH(fecha)=10
  4. GROUP BY fecha;

Eso te devolvería el resultado para el mes de Octubre.

Esto puede que te sirva de pantallazo. Para verlo en profundidad, lee este link: 12.10. Funciones y modificadores para cláusulas GROUP BY
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 12/12/2008, 11:26
Avatar de masterojitos  
Fecha de Ingreso: julio-2008
Ubicación: Lima Callao Chucuito
Mensajes: 1.931
Antigüedad: 11 años, 5 meses
Puntos: 105
Respuesta: Seleccionar el registro con el mayor valor en un campo ???

hola gnzsoloyo, y solo te escribo para decirte el por que de hacer consultas tan complicadas??? haces muchos selects multiples y es en vano........ recargas tu consulta...

ademas, los usuarios son realmente quienes se ven en las complicaciones... ya que si la consulta fueran de miles de registros.. la verdad que no haces consultas eficientes......

TOMALO COMO UN CONSEJO NO???

bueno eso pienso...... gracias y que Dios los Bendiga.
__________________
Atte. MasterOjitos :ojotes:
Todo sobre Programación Web
Las ultimas tendencias en Efectos y Recursos Web: MasterOjitos Blog
  #12 (permalink)  
Antiguo 12/12/2008, 11:59
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.322
Antigüedad: 12 años, 1 mes
Puntos: 2654
Respuesta: Seleccionar el registro con el mayor valor en un campo ???

Bueno, masterojitos, me quedo un poco sorprendido que las consultas que pongo como ejemlpo parezcan demasiado complicadas... habitualmente no llego más allá de una subconsulta en esos foros, lo que es extremadamente simple.

Habitualmente, los select anidados tienen por objeto, precisamente, la disminución del tiempo de procesador y la cantidad de lecturas necesarias, por aprovechamiento de índices, y para evitar que el parser de MySQL desperdicie recursos ya que el WHERE, donde la mayoría pone las selecciones, es la parte que el mismo no puede optimizar...
Me ha ocurrido muy a menudo que cuando intento una sentencia con toda la definición de búsqueda en el WHERE, la cantidad de registros leídos implica un enorme uso de I/O, que es lo que se debe evitar, mientras que si escalono las eliminaciones, el resultado se realiza más rápido.

Tal vez la cosa pase porque habitualmente debo desarrollar cosas realmente complejas, por lo que un SELECT * FROM tabla1, no es la sentencia que suelo ejecutar.
Si mis ejemplos parecen complejos, mira los ejemplos del manual oficial de referencia en la Web de MySQL: Proyecto Twins: 3.7.1. Encontrar todos los mellizos no repartidos
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 12/12/2008 a las 12:08
  #13 (permalink)  
Antiguo 12/12/2008, 12:06
Avatar de masterojitos  
Fecha de Ingreso: julio-2008
Ubicación: Lima Callao Chucuito
Mensajes: 1.931
Antigüedad: 11 años, 5 meses
Puntos: 105
Respuesta: Seleccionar el registro con el mayor valor en un campo ???

maestro.... pero no compares ese ejemplo del mysql.... con lo que te pide este usuario!!!!

el solo pedia el mayor registro.... no los mayores ni mucho menos otras cosas que han posteado.....

pero vale que el debe tener conocimientos en la materia y sacara su propias conclusiones....

PD. el saber se va desarrollando.... pero las habilidades deben quedar!!!!

Dios los Bendiga.
__________________
Atte. MasterOjitos :ojotes:
Todo sobre Programación Web
Las ultimas tendencias en Efectos y Recursos Web: MasterOjitos Blog
  #14 (permalink)  
Antiguo 12/12/2008, 12:14
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.322
Antigüedad: 12 años, 1 mes
Puntos: 2654
Respuesta: Seleccionar el registro con el mayor valor en un campo ???

Creo que se te escapó el post donde dice:
Cita:
pero el problema es que hay más de un registro en `practicas` para cada usuario, y yo necesito sólo el que tenga el mayor valor en el campo `uid` para cada usuario. Con la consulta anterior me muestra más de un registro por usuario, pero yo sólo quiero que muestre uno.
La primera solución eficiente (la que puso jurena), era suficiente para lo que dice el primer post, pero no para cuando aclaró el tema. En ese post finalmente expresa que debía recibir una lista de varios, no uno solo. Por eso la consulta se complica. Pedir el mayor no es lo mismo que pedir el mayor valor de un tema de cada uno de los participantes.
De allí que la consulta resulta más larga: hay una condición adicional.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
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 22:28.