Ved at bruge to brugervariabler og tælle det samme fortløbende store_id, kan du erstatte <=5
med hvilken grænse du ønsker
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
Rediger som anmodet om en forklaring :
Den første underforespørgsel (a) er den, der grupperer og bestiller dataene, så du vil have data som:
store_id | user_id | visits
---------+---------+-------
60 1 5
60 2 3
60 3 1
61 2 4
61 3 2
den anden underforespørgsel (b) indsætter brugervariablen @prev
med -1 og @count
med 1
så vælger vi alle data fra underforespørgslen (a), der bekræfter betingelsen i case
.
-
verificer, at det tidligere store_id (
@prev
) vi har set er forskellig fra det nuværende store_id.Siden den første@prev
er lig med -1 er der intet, der matcher det aktuelle butiks-id, så betingelsen<> er sandt, vi indtaster, så er det andet tilfælde, som bare tjener til at ændre værdien
@prev
med det aktuelle butiks-id. Dette er tricket, så jeg kan ændre de to brugervariable@count
og@prev
i samme stand. -
hvis det forrige store_id er lig med
@prev
forøg bare@count
variabel. -
vi tjekker, at antallet er inden for den værdi, vi ønsker, så
<=5
Så med vores testdata er:
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