elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  Bases de Datos (Moderador: Carloswaldo)
| | | |-+  [Pregunta]: ¿Cómo puedo hacer una consulta de esta manera?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Pregunta]: ¿Cómo puedo hacer una consulta de esta manera?  (Leído 3,494 veces)
Leguim


Desconectado Desconectado

Mensajes: 720



Ver Perfil
[Pregunta]: ¿Cómo puedo hacer una consulta de esta manera?
« en: 24 Junio 2021, 06:59 am »

Hola, hace poco publiqué un tema para optimizar la tabla de notificaciones de la siguiente manera: https://foro.elhacker.net/desarrollo_web/dilema_la_manera_mas_eficaz_y_optima-t510769.0.html

Básicamente lo que hace este sistema es preguntar si la cantidad de notificaciones del usuario es mayor a 50 y si ese es el caso entonces eliminará todas las notificaciones entre el rango LIMIT 50 (posición inicial, cuenta el cero), quantity (cantidad de registros que hay que tomar, sería N (infinito) hasta llegar abajo de todo)

Ahora ya estoy escribiendo pero estoy teniendo un problema que me tiene un poco perdido:
$quantity_not; (cantidad total de notificaciones que tiene el usuario x)
:fecha_restada; (la fecha de hoy - 7 días)
unix_created; (fecha en que se creó este registro/notificación)

Código
  1. if($quantity_not > 50)
  2. {
  3.       $quantity = $quantity_not - 50; // cantidad de registros que tomará en LIMIT
  4.       $consulta = $conexion->prepare('DELETE FROM notificaciones WHERE id_usuario = :id_usuario AND :fecha_restada >= unix_created ORDER BY id_notificacion DESC LIMIT 50, :quantity'); // en LIMIT no pongo 51 porque cuenta el cero también, por eso se pone 50
  5. }
  6.  

Pero esto va a tener un problema y es que el conjunto de datos que me va a devolver será en base a las 2 condiciones (id_usuario = :id_usuario) y (:fecha_restada >= unix_created) por tanto los rangos que se ponen en LIMIT 50, :quantity no va a iniciar en la notificación cuya posición es 50 (51 contando el cero) de forma global sino que será en la posición 50 (51 contando el cero) de aquellas que tengan ya la vigencia (:fecha_restada >= unix_created).

Por ahí no se me entendió muy bien.
Una solución que se me ocurre así rápido sería usar id inferior y id superior donde el id inferior será el id de notificación que tendrá en la posición 50 (51 contando el cero) pero solamente para la condición (id_usuario = :id_usuario) y después obtener el id superior (el id notificacion más antiguo)

En base a esas 2 id inferior y superior entonces poner:
Código
  1. if($quantity_not > 50)
  2. {
  3.       $consulta = $conexion->prepare('DELETE FROM notificaciones WHERE id_usuario = :id_usuario AND :fecha_restada >= unix_created AND (id_notificacion BETWEEN :ID_INFERIOR AND :ID_SUPERIOR) ORDER BY id_notificacion DESC');
  4. }
  5.  

Más que nada comento esto último para que se entienda mejor lo que quiero hacer, preferiblemente sin tener que llegar hacer esto de las id. Capas haya alguna palabra reservada o algo que no conozca.
Espero haberme dado a entender.


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines