Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Sql Query - Limitando os resultados da consulta


Usando duas variáveis ​​de usuário e contando o mesmo store_id consecutivo, você pode substituir <= 5 com o limite que você quiser
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 conforme solicitado alguma explicação:

A primeira subconsulta (a) é aquela que agrupa e ordena os dados para que você tenha dados como:
store_id | user_id | visits
---------+---------+-------
 60           1       5
 60           2       3
 60           3       1
 61           2       4
 61           3       2

a segunda subconsulta (b) inicia a variável de usuário @prev com -1 e @count com 1

então escolhemos todos os dados da subconsulta (a) verificando a condição no case .

  • verifique se o store_id anterior (@prev ) que vimos é diferente do store_id atual. Desde o primeiro @prev é igual a -1, não há nada que corresponda ao store_id atual, portanto, a condição <> é verdade que entramos então é o segundo caso que serve apenas para alterar o valor @prev com o store_id atual. Este é o truque para que eu possa alterar as duas variáveis ​​de usuário @count e @prev na mesma condição.

  • se o store_id anterior for igual a @prev apenas incremente o @count variável.

  • verificamos se a contagem está dentro do valor que queremos para que o <= 5

Então, com nossos dados de teste:
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