Wenn Sie zwei Benutzervariablen verwenden und dieselbe aufeinanderfolgende store_id zählen, können Sie <= 5
ersetzen mit jedem gewünschten Limit
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
Ändern Sie wie gewünscht eine Erklärung:
Die erste Unterabfrage (a) ist diejenige, die die Daten gruppiert und ordnet, sodass Sie Daten wie die folgenden haben:
store_id | user_id | visits
---------+---------+-------
60 1 5
60 2 3
60 3 1
61 2 4
61 3 2
die zweite Unterabfrage (b) initialisiert die Benutzervariable @prev
mit -1 und @count
mit 1
dann wählen wir alle Daten aus der Unterabfrage (a) und verifizieren die Bedingung im case
.
-
vergewissern Sie sich, dass die vorherige store_id (
@prev
), die wir gesehen haben, unterscheidet sich von der aktuellen store_id.Seit dem ersten@prev
gleich -1 ist, gibt es nichts, was mit der aktuellen store_id übereinstimmt, also die Bedingung<>
wahr ist, geben wir dann den zweiten Fall ein, der gerade dazu dient, den Wert@prev
zu ändern mit der aktuellen store_id. Dies ist der Trick, damit ich die beiden Benutzervariablen@count
ändern kann und@prev
im gleichen Zustand. -
wenn die vorherige store_id gleich
@prev
ist Erhöhen Sie einfach den@count
Variable. -
Wir überprüfen, ob die Anzahl innerhalb des gewünschten Werts liegt, also
<= 5
Also mit unseren Testdaten die:
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