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