Door twee gebruikersvariabelen te gebruiken en dezelfde opeenvolgende store_id te tellen, kunt u <= 5
. vervangen met welke limiet je maar wilt
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
Bewerk zoals gevraagd enige uitleg:
De eerste subquery (a) is degene die de gegevens groepeert en ordent, zodat u gegevens krijgt zoals:
store_id | user_id | visits
---------+---------+-------
60 1 5
60 2 3
60 3 1
61 2 4
61 3 2
de tweede subquery (b) init de gebruikersvariabele @prev
met -1 en @count
met 1
dan kiezen we alle gegevens uit de subquery (a) verifiëren van de voorwaarde in de case
.
-
controleer of de vorige store_id (
@prev
) die we hebben gezien, verschilt van de huidige store_id.Sinds de eerste@prev
is gelijk aan -1 er is niets dat overeenkomt met de huidige store_id dus de voorwaarde<>
is waar die we invoeren dan is het tweede geval dat alleen dient om de waarde te wijzigen@prev
met de huidige store_id. Dit is de truc zodat ik de twee gebruikersvariabelen@count
kan wijzigen en@prev
in dezelfde staat. -
als de vorige store_id gelijk is aan
@prev
verhoog gewoon de@count
variabel. -
we controleren of de telling binnen de gewenste waarde ligt, dus de
<= 5
Dus met onze testgegevens de:
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