Mysql
 sql >> Database >  >> RDS >> Mysql

SQL Query - Limitazione dei risultati della query

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