En utilisant deux variables utilisateur et en comptant le même store_id consécutif, vous pouvez remplacer <= 5
avec la limite que vous voulez
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
Modifier comme demandé quelques explications :
La première sous-requête (a) est celle qui regroupe et ordonne les données afin que vous ayez des données comme :
store_id | user_id | visits
---------+---------+-------
60 1 5
60 2 3
60 3 1
61 2 4
61 3 2
la deuxième sous-requête (b) init la variable utilisateur @prev
avec -1 et @count
avec 1
puis nous choisissons toutes les données de la sous-requête (a) en vérifiant la condition dans le case
.
-
vérifiez que le précédent store_id (
@prev
) que nous avons vu est différent du store_id actuel.Depuis le premier@prev
est égal à -1 il n'y a rien qui corresponde au store_id actuel donc la condition<>
est vrai on entre alors est le deuxième cas qui sert juste à changer la valeur@prev
avec le store_id actuel. C'est l'astuce pour que je puisse changer les deux variables utilisateur@count
et@prev
dans le même état. -
si le précédent store_id est égal à
@prev
incrémentez simplement le@count
variables. -
nous vérifions que le nombre est dans la valeur que nous voulons donc le
<= 5
Ainsi, avec nos données de 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