sql >> Base de Datos >  >> RDS >> Mysql

Consulta Sql - Limitación de los resultados de la consulta

Usando dos variables de usuario y contando el mismo store_id consecutivo, puede reemplazar <= 5 con el límite que quieras

SELECT a.*
FROM (
 SELECT store_id, user_id, count(1) as visits 
 FROM shopping
 WHERE store_id IN (60,61,62,63,64,65,66)
 GROUP BY store_id, user_id
 ORDER BY store_id, visits desc, user_id
) a,
(SELECT @prev:=-1, @count:=1) b
WHERE
 CASE WHEN @prev<>a.store_id THEN
   CASE WHEN @prev:=a.store_id THEN
    @count:=1
   END
 ELSE
   @count:[email protected]+1
 END <= 5

Editar según lo solicitado alguna explicación:

La primera subconsulta (a) es la que agrupa y ordena los datos por lo que tendrás datos como:

store_id | user_id | visits
---------+---------+-------
 60           1       5
 60           2       3
 60           3       1
 61           2       4
 61           3       2

la segunda subconsulta (b) inicia la variable de usuario @prev con -1 y @count con 1

luego elegimos todos los datos de la subconsulta (a) verificando la condición en el case .

  • verifique que el store_id anterior (@prev ) que hemos visto es diferente del store_id actual. Desde el primer @prev es igual a -1, no hay nada que coincida con el store_id actual, por lo que la condición <> es cierto ingresamos entonces es el segundo caso que solo sirve para cambiar el valor @prev con el store_id actual. Este es el truco para poder cambiar las dos variables de usuario @count y @prev en las mismas condiciones.

  • si el store_id anterior es igual a @prev solo incrementa el @count variables.

  • comprobamos que el recuento está dentro del valor que queremos por lo que el <= 5

Entonces, con nuestros datos de prueba:

step | @prev | @count | store_id | user_id | visits
-----+-------+--------+----------+---------+-------
  0      -1      1    
  1      60      1        60          1        5 
  2      60      2        60          2        3
  3      60      3        60          3        1
  4      61      1        61          2        4
  5      61      2        61          3        2