Używając dwóch zmiennych użytkownika i licząc ten sam kolejny identyfikator sklepu, możesz zastąpić <= 5
z dowolnym 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
Edytuj zgodnie z żądaniem pewne wyjaśnienie:
Pierwsze podzapytanie (a) to to, które grupuje i porządkuje dane, dzięki czemu uzyskasz dane takie jak:
store_id | user_id | visits
---------+---------+-------
60 1 5
60 2 3
60 3 1
61 2 4
61 3 2
drugie podzapytanie (b) inicjuje zmienną użytkownika @prev
z -1 i @count
z 1
następnie wybieramy wszystkie dane z podzapytania (a) weryfikującego warunek w case
.
-
sprawdź, czy poprzedni identyfikator sklepu (
@prev
) różni się od obecnego identyfikatora sklepu. Od pierwszego@prev
jest równe -1, nie ma nic, co pasuje do bieżącego identyfikatora sklepu, więc warunek<>
to prawda, wpisujemy to jest drugim przypadkiem, który służy tylko do zmiany wartości@prev
z bieżącym identyfikatorem sklepu. To jest sztuczka, dzięki której mogę zmienić dwie zmienne użytkownika@count
i@prev
w tym samym stanie. -
jeśli poprzedni identyfikator sklepu jest równy
@prev
po prostu zwiększ@count
zmienna. -
sprawdzamy, czy liczba mieści się w żądanej wartości, więc
<= 5
Tak więc z naszymi danymi testowymi:
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