Usando due variabili utente e contando lo stesso store_id consecutivo, puoi sostituire <= 5
con qualsiasi limite tu voglia
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
Modifica come richiesto alcune spiegazioni:
La prima sottoquery (a) è quella che raggruppa e ordina i dati in modo da avere dati come:
store_id | user_id | visits
---------+---------+-------
60 1 5
60 2 3
60 3 1
61 2 4
61 3 2
la seconda sottoquery (b) avvia la variabile utente @prev
con -1 e @count
con 1
quindi scegliamo tutti i dati dalla sottoquery (a) verificando la condizione nel case
.
-
verifica che il precedente store_id (
@prev
) che abbiamo visto è diverso dall'attuale store_id. Dal primo@prev
è uguale a -1 non c'è nulla che corrisponda allo store_id corrente quindi la condizione<>
è vero entriamo quindi è il secondo caso che serve solo a modificare il valore@prev
con lo store_id corrente. Questo è il trucco così posso cambiare le due variabili utente@count
e@prev
nelle stesse condizioni. -
se lo store_id precedente è uguale a
@prev
basta aumentare il@count
variabile. -
controlliamo che il conteggio rientri nel valore che vogliamo quindi il
<= 5
Quindi con i nostri dati di test:
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