Extraño: select con offset y limit devuelve datos duplicados

Iniciado por Filantropo, 6 Diciembre 2020, 02:18 AM

0 Miembros y 1 Visitante están viendo este tema.

Filantropo

Holas.
Tengo una tabla cliente:


create table cliente (
      identificador int not null primary key,
    nombres varchar(30),
    apellidos varchar (30),
    email varchar (50),
    telefono varchar (20),
       fecha_insercion datetime
);


Las inserciones son mediante SP_CLIENTE_INSERTAR


CREATE PROCEDURE SP_CLIENTE_INSERTAR(
   in arg_identificador int,
   in arg_nombres varchar(30),
   in arg_apellidos varchar(30),
   in arg_email varchar(30),
   in arg_telefono varchar (20)
)
BEGIN
insert into cliente values(arg_identificador,
arg_nombres,
arg_apellidos,
arg_email,
arg_telefono,
NOW());
END//




SP_CLIENTE_BUSCAR realiza busquedas por nombre o apellido, ademas se le pasa un offset y limit para devolver solo una porcion de la busqueda y mostrarlo en forma de paginacion.


CREATE PROCEDURE SP_CLIENTE_BUSCAR(in arg_cadena varchar(50),
in arg_offset int,
in arg_limit int)
BEGIN
select identificador,
    nombres,
    apellidos,
    email,
    telefono
    from cliente
    where nombres like concat("%",arg_cadena,"%")
    or apellidos like concat("%",arg_cadena,"%")
    order by fecha_insercion asc
    LIMIT arg_offset,arg_limit;
END//



Inserte 12 clientes en un sola ejecucion y en la bd se insertaron todos con igual fecha_insercion como es d esperar:

Id nombre  fecha_insercion          otros_campos.......
1 maria   2020-12-05  17:31:19
2 julio   2020-12-05  17:31:19
3 antonio 2020-12-05  17:31:19
4 marlon  2020-12-05  17:31:19
5 mariela 2020-12-05  17:31:19
6 carmen  2020-12-05  17:31:19
7 ramiro  2020-12-05  17:31:19
8 carla   2020-12-05  17:31:19
9 paola   2020-12-05  17:31:19
10monica  2020-12-05  17:31:19
11 melisa 2020-12-05  17:31:19
12 nicole 2020-12-05  17:31:19



el problema es que el SP_CLIENTE_BUSCAR devuelve registros duplicados y en orden inverso durante la paginacion, ademas que se omite 4 o 5 de los 12 registros.
Lo que me devuelve el sp_cliente_buscar:


paginacion se realiza por cada 5 registros:

PAGINA1:
1 maria    2020-12-05  17:31:19
2 julio    2020-12-05  17:31:19
3 antonio  2020-12-05  17:31:19
4 marlon   2020-12-05  17:31:19
5 mariela  2020-12-05  17:31:19

PAGINA2:
6 carmen   2020-12-05  17:31:19
5 mariela  2020-12-05  17:31:19
4 marlon   2020-12-05  17:31:19
3 antonio  2020-12-05  17:31:19
2 julio    2020-12-05  17:31:19

PAGINA 03:
2 julio    2020-12-05  17:31:19
1 maria    2020-12-05  17:31:19

La bd esta en un servidor de hosting, el gestor es phpMyAdmin.
Alguien sabra por que ocurre esto, esta mal mi codigo o esta fallando el servidor?

Edicion:
Hay otra tabla llamada empleados es casi igual a la de clientes la unica diferencia es: tiene 3 campos adicionales, su proc almacenado de busqueda SP_EMPLEADO_BUSCAR es igual al del cliente, pero este si funciona correctamente.

Edicion 2
Olvide decir que los resultados mostrados son de una busqueda sin ningun texto. internamente la ejecucion seria asi:

call SP_CLIENTE_BUSCAR ('',0,5)  <-----PAG 1
call SP_CLIENTE_BUSCAR ('',5,5)  <-----PAG 2
call SP_CLIENTE_BUSCAR ('',10,5)  <-----PAG 3

Crei que tenia un error el codigo php que invoca a este proc almacenado pero no. Ejecute directamente en la consola phpmyadmin los 3 calls que escribi arriba y devuelve igual que el php: duplicados e invertidos
Deberia mostrar todos los registros (12 total) divididos en: pag1 y pag2 cada uno con 5 registros y por ultimo pag3 con 2 registros, a diferencia de SP_EMPLEADO_BUSCAR que siendo casi lo mismo Si trabaja como se espera.

Tambien es extraño que si se le pasa offset 0 y un limit alto me devuelve ahora si la lista completa de 12 sin duplicados.

call SP_CLIENTE_BUSCAR ('',0,5)  <-----PAG 1


call SP_CLIENTE_BUSCAR ('',5,5)  <-----PAG 2


call SP_CLIENTE_BUSCAR ('',10,5)  <-----PAG 3


call SP_CLIENTE_BUSCAR ('',0,9999999)


Lista completa clientes


En la captura los nombres: patricia, melisa, julio, marleni, eduardo son los que se repiten y en orden inverso.
Estoy mal o el servidor esta medio loco?

K-YreX

Cita de: Filantropo en  6 Diciembre 2020, 02:18 AM
el problema es que el SP_CLIENTE_BUSCAR devuelve registros duplicados y en orden inverso durante la paginacion, ademas que se omite 4 o 5 de los 12 registros.
Lo que me devuelve el sp_cliente_buscar:

paginacion se realiza por cada 5 registros:

PAGINA1:
1 maria    2020-12-05  17:31:19
2 julio    2020-12-05  17:31:19
3 antonio  2020-12-05  17:31:19
4 marlon   2020-12-05  17:31:19
5 mariela  2020-12-05  17:31:19

PAGINA2:
6 carmen   2020-12-05  17:31:19
7 ramiro   2020-12-05  17:31:19
5 mariela  2020-12-05  17:31:19
4 marlon   2020-12-05  17:31:19
3 antonio  2020-12-05  17:31:19
2 julio    2020-12-05  17:31:19

PAGINA 03:
2 julio    2020-12-05  17:31:19
1 maria    2020-12-05  17:31:19

La bd esta en un servidor de hosting, el gestor es phpMyAdmin.
Alguien sabra por que ocurre esto, esta mal mi codigo o esta fallando el servidor?

No tengo demasiada experiencia en bases de datos pero creo que sería una buena idea incluir con qué argumentos se está llamando al procedimiento.
Además veo que dices que la paginación se hace por cada 5 registros pero la Página 2 tiene 6 registros. Esto te ocurre así o ha sido un error al escribirlo aquí??
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

AlbertoBSD

El problema es la fecha de inserción "order by fecha_insercion asc", como hay registros duplicados de fecha no es posible que mysql guarde que registros en base a la fecha ya te envió previamente, tiene que ser forzosamente un order by ID.

Sobre que te devuelva 6 registros en lugar de 5, eso parece ser error de la funcion que llama a ese procedimiento de mysql.

Saludos!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

Filantropo

#3
Cita de: AlbertoBSD en  6 Diciembre 2020, 03:38 AM
El problema es la fecha de inserción "order by fecha_insercion asc", como hay registros duplicados de fecha no es posible que mysql guarde que registros en base a la fecha ya te envió previamente, tiene que ser forzosamente un order by ID.

Sobre que te devuelva 6 registros en lugar de 5, eso parece ser error de la funcion que llama a ese procedimiento de mysql.

Saludos!
Ah si claro, todos los registros fueron insertados a la vez por eso la fecha y hora es la misma, lo corregi cambiando a  mano cada fecha.
Pero me dejado la duda ¿por que cuando enumero todos los registros en un solo golpe (CALL SP_CLIENTE_BUSCAR ('',0,9999))
Si me muestran todos los registros exactos sin duplicados pero si los pagino  CALL SP_CLIENTE_BUSCAR ('',0,5) ; CALL SP_CLIENTE_BUSCAR ('',5,5) CALL SP_CLIENTE_BUSCAR ('',10,5) y  CALL SP_CLIENTE_BUSCAR ('',15,5) me
los duplica?, si todos los registros tienen el mismo valor en el campo fecha no deberia el gestor ordenarlos por algun otro campo o debo indicarlo explicitamente???

AlbertoBSD

Cita de: Filantropo en 22 Diciembre 2020, 22:06 PM
si todos los registros tienen el mismo valor en el campo fecha no deberia el gestor ordenarlos por algun otro campo o debo indicarlo explicitamente???

Debes de indicarlo explícitamente., De hecho no deberias de utilizar la fecha como campo para ordenarlos, lo ideal es utilizar el ID.

Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW