Използвайки две потребителски променливи и отчитайки един и същ последователен store_id, можете да замените <= 5
с какъвто лимит искате
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
Редактирайте, както е поискано някакво обяснение:
Първата подзаявка (a) е тази, която групира и подрежда данните, така че ще имате данни като:
store_id | user_id | visits
---------+---------+-------
60 1 5
60 2 3
60 3 1
61 2 4
61 3 2
втората подзаявка (b) инициира потребителската променлива @prev
с -1 и @count
с 1
след това избираме всички данни от подзаявката (a), проверявайки условието в case
.
-
проверете дали предишният store_id (
@prev
), който видяхме, е различен от текущия store_id. От първия@prev
е равно на -1, няма нищо, което да съответства на текущия store_id, така че условието<>
е вярно, ние въвеждаме, тогава е вторият случай, който просто служи за промяна на стойността@prev
с текущия store_id. Това е трикът, за да мога да променя двете потребителски променливи@count
и@prev
в същото състояние. -
ако предишният store_id е равен на
@prev
просто увеличете@count
променлива. -
проверяваме дали броят е в рамките на желаната от нас стойност, така че
<= 5
Така че с нашите тестови данни:
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