entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

Consulta mysql

Espero poder explicar bien el problema que tengo

Tengo una tabla con idCliente, fechaTramite y un ultimo campo llamado contador

un ejemplo de los datos

idCliente | fechaTramite | Contador
----1050--| - 2014-11-15|----- 1
----1050--| - 2014-11-17|----- 2
----1050--| - 2014-11-20|----- 3
----2033--| - 2014-11-11|----- 1
----2033--| - 2014-11-13|----- 2

la fechaTramite menor tiene que llevar el numero menor en el contador (1) la fecha que sigue un "2" y asi consecutivamente dependiendo la fechaTramite. (la tabla la tengo ordenada por idCliente,fechaTramite)
creo yo que con un while dentro de otro while podría ir asignando los valores, pero mi lógica ya no dio para más.

Gracias y saludos.

0voto

jonatancastro1 comentado

No te entendi bien, quieres hacer una consulta en la que venga una cuenta con Contador independiente del idCliente, o no sabes como recorrer los resultados de una consulta.

3 Respuestas

3votos

Leonardo-Tadei Puntos227320

Hola @jonatancastro1,

Podrías resolver esto en una query sin que la tabla tenga el campo contador

SELECT * , (
  SELECT COUNT( T.idCliente ) +1
  FROM Tramites AS T
  WHERE Tramites.idCliente = T.idCliente
  AND T.fechaTramite < Tramites.fechaTramite
) AS contadorCalculado
FROM Tramites
ORDER BY idCliente

Fijate que en la consulta el valor del contador se calcula, en vez de guardarse, con lo que te evitás tener que averiguarlo a cada nuevo INSERT. De hecho, las reglas de normalización dicen que no deben guardarse datos que pueden obtenerse mediante un cálculo, ya que eso es una repetición de datos y no se deben guardar datos repetidos (aunque a veces argementando performance te sugieron hacerlo, muchas veces de forma injustificada... pero eso es otra historia).

Para mejorar la velocidad de las consultas deberías tener un índice por idCliente o otro por fechaTramite. Se mejoraría más todavía si la tabla tuviese un ID único clave primaria (autoincremental por ejemplo) y la comparación en la query anidada compare por este ID, que sería equivalente a la fecha.

Saludos cordiales!

0voto

Alejandro Castillo A comentado

Muchas gracias!

1voto

EduardoIbarra Puntos160

A ver si no está muy rebuscado:

  1. Crea una tabla auxiliar (AUX).
  2. Haz un select distinct por cliente
  3. Haz un loop por los clientes seleccionados (Loop 1)
  4. Por cada cliente haz un select de los trámites que le correspondan, ordenado por fecha.
  5. Inicializa una variable contador en 0.
  6. Haz un loop por los trámites (Loop 2), va anidado en el Loop 1. Dentro de este loop incrementa contador.
  7. Inserta en la tabla AUX cada registro con su respectivo contador.
  8. Al terminar los 2 loops, elimina la tabla original, y renombra la tabla AUX al nombre de la tabla original.

Nota: El contador debes inicializarlo entre los dos loops para que funcione correctamente por cliente.

1voto

dairon Puntos17120

Lo primero a ver es que lógica para tu proyecto tiene el campo Contador, es decir que función cumple y que datos logicamente te brinda para que de esa forma decidas que es lo más optimo ya que como dice el profesor Leonardo-Tadei los datos calculados no se deben almacenar sino sacar a travez de una consulta o llamando a una view dentro de la base de datos para separar más las capas y funciones lo prefiero así. Primero define la logíca de tu proyecto y de cada tabla, relacion y campo de tu data base y que función cumplen para todos los datos que les pediras pues muchas veces las soluciones más sencillas son las mejores y más optimas. Cuando tengas la lógica tendras la respuesta tu mismo.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta