Menggunakan dua variabel pengguna dan menghitung store_id yang sama berturut-turut, Anda dapat mengganti <= 5
dengan batasan apa pun yang Anda inginkan
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
Edit sesuai permintaan beberapa penjelasan :
Subquery pertama (a) adalah subquery yang mengelompokkan dan mengurutkan data sehingga Anda akan memiliki data seperti:
store_id | user_id | visits
---------+---------+-------
60 1 5
60 2 3
60 3 1
61 2 4
61 3 2
subquery kedua (b) init variabel pengguna @prev
dengan -1 dan @count
dengan 1
kemudian kita memilih semua data dari subquery (a) memverifikasi kondisi di case
.
-
verifikasi bahwa store_id sebelumnya (
@prev
) yang kita lihat berbeda dari store_id saat ini. Sejak@prev
pertama sama dengan -1 tidak ada yang cocok dengan store_id saat ini sehingga kondisinya<>
benar kita masukkan maka adalah kasus kedua yang hanya berfungsi untuk mengubah nilai@prev
dengan store_id saat ini. Ini triknya biar bisa ganti 2 variabel user@count
dan@prev
dalam kondisi yang sama. -
jika store_id sebelumnya sama dengan
@prev
cukup tambahkan@count
variabel. -
kami memeriksa bahwa hitungannya berada dalam nilai yang kami inginkan sehingga
<= 5
Jadi dengan data pengujian kami:
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