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