Mysql
 sql >> Base de données >  >> RDS >> Mysql

Sql Query - Limitation des résultats de la requête

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