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

Obtener el registro mas alto

Estas en el tema de Obtener el registro mas alto en el foro de Mysql en Foros del Web. Hola amigos, Vereis tengo una consulta en la que se obtienen descuentos de un usuario, la cosa es que la table de descuentos se van ...
  #1 (permalink)  
Antiguo 06/11/2013, 06:46
 
Fecha de Ingreso: octubre-2013
Mensajes: 17
Antigüedad: 10 años, 6 meses
Puntos: 0
Obtener el registro mas alto

Hola amigos,

Vereis tengo una consulta en la que se obtienen descuentos de un usuario, la cosa es que la table de descuentos se van guardando todos los descuento, entonces la idea es que la consulta saque el ultimo descuento de cada usuario y ahora mismo esta sacando el primero, deberia sacar el del id mas alto.

Pego la consulta:

Código MySQL:
Ver original
  1. Select ed.id as id_empresas_descuentos, ed.id_empresas,
  2. ed.perfil, e.id as id_descuento, e.id_empresas, e.activo,
  3. e.descuento, e.limitaciones, e.fecha_desde, e.fecha_hasta,
  4. m.id, m.nombre, m.id_categorias, m.nombre_pc,
  5. m.apellido1_pc, m.email, m.telefono, m.cif, em.id as
  6. id_empresas, em.id_mis_datos, p.id_empresas
  7. FROM misdatos m INNER JOIN empresas em On em.id_mis_datos = m.id
  8. INNER JOIN empresas_direcciones ed On ed.id_empresas = em.id
  9. INNER JOIN empresas_descuentos e On e.id_empresas = ed.id_empresas
  10. INNER JOIN pagos p On p.id_empresas = em.id AND e.activo = 1 and e.fecha_hasta >= "2013-11-06"
  11. GROUP BY ed.id_empresas limit 18, 9


He probado añadiendo un max(e.id) pero no funciona, a ver si alguien sabe que puede estar pasando.

Un Saludo!

Última edición por gnzsoloyo; 06/11/2013 a las 07:09 Razón: Legibilidad de la consulta
  #2 (permalink)  
Antiguo 06/11/2013, 07:09
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, 5 meses
Puntos: 2658
Respuesta: Obtener el registro mas alto

Por lo pronto, tu consulta está usando un LIMIT de modo tal que de los resultados devueltos, descarta los 18 primeros, y devuelve los neuve siguientes. Es decir que estás leyendo del 19º al 27º.
¿Exactamente por qué haces eso?
__________________
¿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 06/11/2013, 07:16
 
Fecha de Ingreso: octubre-2013
Mensajes: 17
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Obtener el registro mas alto

Hola amigo,

Estoy haciendo eso por que tiene un control de paginación y esta es la consulta resultante de la 3º pagina, de todos modos he probado a quitar el limit y sigue sin funcionar


Saludos!
  #4 (permalink)  
Antiguo 06/11/2013, 07:25
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, 5 meses
Puntos: 2658
Respuesta: Obtener el registro mas alto

tu consulta estaría básicamente bien, siempre y cuando todas las tablas tengan registros relacionados (si falta relación entre registros de una tabla, no saldrá, aunque los tenga en las otras). Eso no debería ser problema
Por otro lado, le estás poniendo una condición de fecha, tal que sólo devolverá datos de aquellos que cumplan con la fecha, y no todos los últimos descuentos existentes, que bien podrían ser anteriores.
Fuera de eso, no debería haber problemas en la consulta tal como la pones, por lo que yo probaría deshabilitar la fecha:
Código MySQL:
Ver original
  1. /* Formatted on 06/11/2013 10:14:57 (QP5 v5.163.1008.3004) */
  2.   SELECT MAX(ed.id)  id_empresas_descuentos,
  3.          ed.id_empresas,
  4.          ed.perfil,
  5.          e.id  id_descuento,
  6.          e.id_empresas,
  7.          e.activo,
  8.          e.descuento,
  9.          e.limitaciones,
  10.          e.fecha_desde,
  11.          e.fecha_hasta,
  12.          m.id,
  13.          m.nombre,
  14.          m.id_categorias,
  15.          m.nombre_pc,
  16.          m.apellido1_pc,
  17.          m.email,
  18.          m.telefono,
  19.          m.cif,
  20.          em.id  id_empresas,
  21.          em.id_mis_datos,
  22.          p.id_empresas
  23.     FROM misdatos m
  24.          INNER JOIN empresas em ON em.id_mis_datos = m.id
  25.          INNER JOIN empresas_direcciones ed ON ed.id_empresas = em.id
  26.          INNER JOIN empresas_descuentos e ON e.id_empresas = ed.id_empresas
  27.          INNER JOIN pagos p ON  p.id_empresas = em.id
  28.         e.activo = 1
  29.         -- AND e.fecha_hasta >= "2013-11-06"
  30. GROUP BY ed.id_empresas
Por cierto: No uses AS, sólo lleva a ensuciar código, y es una cláusula obsoleta, mantenida por compatibilidad.
__________________
¿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 06/11/2013, 07:38
 
Fecha de Ingreso: octubre-2013
Mensajes: 17
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Obtener el registro mas alto

Umm,

Gracias amigo por tu respuesta, acabo de probar el sql pero sigue igual, el resultado que me da es que si un usuario tiene dos descuentos, uno con id= 102 y otro con id = 103 me saca el de id =102 y deberia sacar el de 103.

No se que puede ser.

Muchas gracias de todos modos!
  #6 (permalink)  
Antiguo 06/11/2013, 08:02
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, 5 meses
Puntos: 2658
Respuesta: Obtener el registro mas alto

Lo que no puede estar sacando es el 102 si ese campo pertenece a la columna empresas_descuentos.id. no está claro el origen del dato, pero para el caso el problema es el funcionamiento del GROUP BY en MySQL:
Como MySQL admite usar GROUP BY sin necesidad de indicar todos los campos no afectados por funciones agregfadas (MAX() en este caso), la pregunta es qué pasa con los otros vampos no usados en él.
Simple: Devuelve el primer valor que encuentre, en el primer registro devuelto para las cindciones dadas.
Eso significa que si ese 102 pertenece a un campo distinto del afectado por el MAX(), es correcto que devuelva eso. Lo que estaría mal en todo caso sería la construcción de la tabla, ya que no deberías incluir campos que puedan tener valores diferenciales entre distintos registros.
¿Se entiende la idea?
Básicamente, mira qué pasa cuando haces esto:
Código MySQL:
Ver original
  1. SELECT MAX(ed.id)  id_empresas_descuentos,
  2.          ed.id_empresas,
  3.          ed.perfil,
  4.          e.id  id_descuento,
  5.          e.id_empresas,
  6.          e.activo,
  7.          e.descuento,
  8.          e.limitaciones,
  9.          e.fecha_desde,
  10.          e.fecha_hasta,
  11.          m.id,
  12.          m.nombre,
  13.          m.id_categorias,
  14.          m.nombre_pc,
  15.          m.apellido1_pc,
  16.          m.email,
  17.          m.telefono,
  18.          m.cif,
  19.          em.id  id_empresas,
  20.          em.id_mis_datos,
  21.          p.id_empresas
  22.     FROM misdatos m
  23.          INNER JOIN empresas em ON em.id_mis_datos = m.id
  24.          INNER JOIN empresas_direcciones ed ON ed.id_empresas = em.id
  25.          INNER JOIN empresas_descuentos e ON e.id_empresas = ed.id_empresas
  26.          INNER JOIN pagos p ON  p.id_empresas = em.id
  27.         e.activo = 1
  28.         -- AND e.fecha_hasta >= "2013-11-06"
  29. GROUP BY ed.id_empresas,
  30.          ed.perfil,
  31.          e.id  id_descuento,
  32.          e.id_empresas,
  33.          e.activo,
  34.          e.descuento,
  35.          e.limitaciones,
  36.          e.fecha_desde,
  37.          e.fecha_hasta,
  38.          m.id,
  39.          m.nombre,
  40.          m.id_categorias,
  41.          m.nombre_pc,
  42.          m.apellido1_pc,
  43.          m.email,
  44.          m.telefono,
  45.          m.cif,
  46.          em.id  id_empresas,
  47.          em.id_mis_datos,
  48.          p.id_empresas;
Si devuelve más de un registro por cada ed.id_empresas, entonces lo que tienes es mal construida la consulta, como te digo, y deberás rediseñarla para hacerla en partes.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: join, registro, select
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 03:18.