sql >> Databáze >  >> RDS >> Mysql

Sql Query – omezení výsledků dotazů

Pomocí dvou uživatelských proměnných a započítáním stejného po sobě jdoucího store_id můžete nahradit <= 5 s libovolným limitem

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

Upravit podle požadavku na vysvětlení:

První dílčí dotaz (a) je ten, který seskupuje a uspořádává data, takže budete mít data jako:

store_id | user_id | visits
---------+---------+-------
 60           1       5
 60           2       3
 60           3       1
 61           2       4
 61           3       2

druhý dílčí dotaz (b) inicial uživatelskou proměnnou @prev s -1 a @count s 1

poté vybereme všechna data z poddotazu (a) ověřujícího podmínku v case .

  • ověřte, že předchozí store_id (@prev ), které jsme viděli, se liší od aktuálního store_id. Od prvního @prev je rovno -1, neexistuje nic, co by odpovídalo aktuálnímu store_id, takže podmínka <> je pravda, zadáme, pak je druhý případ, který slouží pouze ke změně hodnoty @prev s aktuálním store_id. Toto je trik, abych mohl změnit dvě uživatelské proměnné @count a @prev ve stejném stavu.

  • pokud se předchozí store_id rovná @prev stačí zvýšit @count proměnná.

  • zkontrolujeme, že počet je v rámci požadované hodnoty, takže <= 5

Takže s našimi testovacími daty:

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   


  1. Jak nahradit (null) hodnoty výstupem 0 v PIVOT

  2. 3 způsoby, jak „Unhex“ řetězec v MySQL

  3. Vložení do tabulky mysql a přepsání aktuálních dat

  4. Jak funguje current_timestamp() v PostgreSQL