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