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

Consulta complicada SQL (para mi)

Estas en el tema de Consulta complicada SQL (para mi) en el foro de Mysql en Foros del Web. tengo una sentencia que quiero que me devuelva el maximo de un atributo concreto de los 5 primeros registros. y lo tengo asi: select max(comentarios) ...
  #1 (permalink)  
Antiguo 10/04/2011, 05:44
 
Fecha de Ingreso: abril-2011
Mensajes: 12
Antigüedad: 13 años
Puntos: 0
Consulta complicada SQL (para mi)

tengo una sentencia que quiero que me devuelva el maximo de un atributo concreto de los 5 primeros registros.
y lo tengo asi:
select max(comentarios) from visible limit 0,5

Yo creo que esto me muestra el registro con mas comentarios de los primeros cinco registros, pero no es asi. ¿Queda claro o os he hecho la picha un lio?

Ejemplo:
A- 5 Comentarios
B- 3 Comentarios
C- 4 Comentarios
D- 7 Comentarios
F- 1 Comentarios
G-12 Comentarios

Aqui hay 6 registros pero quiero que solo me busque el maximo de los 5 primeros por lo que el maximo seria "7" pero usando la consulta de arriba me muestra el 12... ¿Por qué puede ser?
  #2 (permalink)  
Antiguo 10/04/2011, 06:06
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Consulta complicada SQL (para mi)

Cita:
¿Por qué puede ser?
Que el MAX() opera sobre el total antes de buscar el total, y LIMIT trabaja también sobre el total devuelto.
Para lograr que te devuelva mayor de cinco primeros registros, tienes que usar una subconsulta.

Código MySQL:
Ver original
  1. SELECT MAX(comentarios) Maximo
  2. FROM (SELECT id, comentarios FROM visible LIMIT 0,5) T1;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 10/04/2011, 06:18
 
Fecha de Ingreso: abril-2011
Mensajes: 12
Antigüedad: 13 años
Puntos: 0
Respuesta: Consulta complicada SQL (para mi)

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Que el MAX() opera sobre el total antes de buscar el total, y LIMIT trabaja también sobre el total devuelto.
Para lograr que te devuelva mayor de cinco primeros registros, tienes que usar una subconsulta.

Código MySQL:
Ver original
  1. SELECT MAX(comentarios) Maximo
  2. FROM (SELECT id, comentarios FROM visible LIMIT 0,5) T1;
Me ha funcionado perfecto. Pero no entiendo del todo que hace. ¿Lo puedes explicar y asi de paso lo aprendo para otra vez?
  #4 (permalink)  
Antiguo 10/04/2011, 06:33
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Consulta complicada SQL (para mi)

Cuando usas MAX() lo que hace es buscar el mayor de los valores de toda la tabla. Te devolverá siempre un sólo registro, a menos que haya un agrupamiento, caso en el cual devolverá el mayor de cada grupo. Por eso tu consulta devuelve siempre 12.
LIMIT opera si y sólo si la consulta devuelve más de un registro que cumpla con la condición, pero como en este caso eso es un sólo registro...

El error consiste en suponer que LIMIT opera antes que MAX(). No es así. Para cuando se ejecuta el LIMIT, la verificación de condiciones ya se realizó.

Para que realice lo que necesitas lo primero que hay que hacer es obtener el grupo completo de registros a evaluar, cosa que se tiene que hacer con una subconsulta. Esa subconsulta genera una tabla derivada (en memoria, obtenida por consulta) de sólo 5 registros y es a esos registros a los que s eaplica el MAX().

¿Se entiende?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 10/04/2011, 06:49
 
Fecha de Ingreso: abril-2011
Mensajes: 12
Antigüedad: 13 años
Puntos: 0
Respuesta: Consulta complicada SQL (para mi)

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Cuando usas MAX() lo que hace es buscar el mayor de los valores de toda la tabla. Te devolverá siempre un sólo registro, a menos que haya un agrupamiento, caso en el cual devolverá el mayor de cada grupo. Por eso tu consulta devuelve siempre 12.
LIMIT opera si y sólo si la consulta devuelve más de un registro que cumpla con la condición, pero como en este caso eso es un sólo registro...

El error consiste en suponer que LIMIT opera antes que MAX(). No es así. Para cuando se ejecuta el LIMIT, la verificación de condiciones ya se realizó.

Para que realice lo que necesitas lo primero que hay que hacer es obtener el grupo completo de registros a evaluar, cosa que se tiene que hacer con una subconsulta. Esa subconsulta genera una tabla derivada (en memoria, obtenida por consulta) de sólo 5 registros y es a esos registros a los que s eaplica el MAX().

¿Se entiende?
Se entiende perfecto, muchisimas gracias y RESUELTO!

Etiquetas: sql
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 17:03.