Estoy intentando realizar una consulta que discrimine por fechas(para paginar los datos y que sólo devuelva los de la página correspondiente y no todo el conjunto).
El motor de BD es MySQL, aunque ese no es el problema.
Os comento, el problema lo presenta los campos por los que ordeno y/o discrimino, que tienen que ser la fecha y el ID.
Por ejemplo, tenemos los siguientes resultados, correspondientes a Eventos Pasados(es decir, eventos anteriores a hoy):
http://twitpic.com/2rzzjg
Bien, cuando se abre la pestaña de eventos pasados muestra 26,25 y 21 porque son los últimos que se han celebrado, ok?(está paginando a 3 elementos por página)
Ahora pulsamos el botón de Anteriores y se lanza la siguiente consulta:
Código SQL:
Ver original
SELECT * FROM gp_eventos_prin INNER JOIN gp_eventos_detalle ON gp_eventos_prin.id_evento=gp_eventos_detalle.id_evento_prin WHERE gp_eventos_prin.fecha_evento<= "2010/10/09" AND gp_eventos_prin.id_evento<21 ORDER BY gp_eventos_prin.fecha_evento DESC,gp_eventos_prin.id_evento ASC LIMIT 9
Que ocurre??
Que en vez de mostrar el 30,29 y 28 que serían los siguientes después de los dichos anteriormente, pues muestra el 18,20 y 19.
El caso es que la función que llama a ANTERIORES pasa el último evento mostrado en pantalla, que sería el ID 21 con fecha "2010/09/10".
La lógica dice que el botón ANTERIOR tiene que consultar y obtener los Eventos cuya fecha sea Igual o Inferior al último evento mostrado (porque igual? porque puede haber más eventos ese día...) y lo del ID es porque si no lo pongo, me mostrará igual los eventos que estaba mostrando...y eso no mola xD
Pero claro, como el ID es un número que incrementa automáticamente la BD...pues nos ha jodido, ya que puede haber un Evento con un ID mayor pero con una fecha menor al último mostrado(que es lo que ocurre en este ejemplo) y ahí nos ha jodido la consulta....
Es por eso que recurro a vosotros ya desesperado a ver si me podeis ofrecer una solución a este problemón...ya que no doy salido del bache...y ya no sé como crear la consulta para que me devuelva correctamente los datos...
Gracias por la ayuda y un Saludo a todos!
PD: lo mismo ocurre con el botón siguiente...
Os dejo aquí si quereis la función que contruye las query's:
Código C:
Ver original
private static MySqlCommand CMD_Eventos_Anteriores(string avance, Evento Ev_Ind,int Limit) { DateTime desde = DateTime.Now; DateTime hasta = DateTime.Now; DateTime calculos = DateTime.Now; MySqlCommand sql; MySqlParameter paramDesde; MySqlParameter paramId; MySqlParameter paramHasta; desde = DateTime.Now.AddDays(-1); switch (avance) { case "anterior": sql = new MySqlCommand(@"SELECT * FROM gp_eventos_prin INNER JOIN gp_eventos_detalle ON gp_eventos_prin.id_evento=gp_eventos_detalle.id_evento_prin WHERE gp_eventos_prin.fecha_evento<= ?desde AND gp_eventos_prin.id_evento<?id ORDER BY gp_eventos_prin.fecha_evento DESC,gp_eventos_prin.id_evento ASC LIMIT ?limt"); paramId = new MySqlParameter("?id", MySqlDbType.VarChar); paramId.Value = Ev_Ind.Id_Evento; sql.Parameters.Add(paramId); break; case "siguiente": sql = new MySqlCommand(@"SELECT * FROM gp_eventos_prin INNER JOIN gp_eventos_detalle ON gp_eventos_prin.id_evento=gp_eventos_detalle.id_evento_prin WHERE (gp_eventos_prin.fecha_evento>= ?desde AND gp_eventos_prin.id_evento!=?id) AND gp_eventos_prin.fecha_evento<= ?hasta ORDER BY gp_eventos_prin.fecha_evento DESC,gp_eventos_prin.id_evento ASC LIMIT ?limt"); paramId = new MySqlParameter("?id", MySqlDbType.VarChar); paramId.Value = Ev_Ind.Id_Evento; sql.Parameters.Add(paramId); paramDesde = new MySqlParameter("?hasta", MySqlDbType.DateTime); paramDesde.Value = desde; sql.Parameters.Add(paramDesde); break; default: sql = new MySqlCommand(@"SELECT * FROM gp_eventos_prin INNER JOIN gp_eventos_detalle ON gp_eventos_prin.id_evento=gp_eventos_detalle.id_evento_prin WHERE gp_eventos_prin.fecha_evento<= ?desde ORDER BY gp_eventos_prin.fecha_evento DESC,gp_eventos_prin.id_evento ASC LIMIT ?limt"); break; } paramDesde = new MySqlParameter("?desde", MySqlDbType.DateTime); if (avance == "default") paramDesde.Value = desde; else paramDesde.Value = Ev_Ind.Fecha_Evento; sql.Parameters.Add(paramDesde); paramDesde = new MySqlParameter("?limt", MySqlDbType.Int32); paramDesde.Value = Limit; sql.Parameters.Add(paramDesde); return sql; }