Sử dụng hai biến người dùng và đếm cùng một store_id liên tiếp, bạn có thể thay thế <= 5
với bất kỳ giới hạn nào bạn muốn
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
Chỉnh sửa theo yêu cầu một số giải thích:
Truy vấn con đầu tiên (a) là truy vấn nhóm và sắp xếp dữ liệu để bạn có dữ liệu như:
store_id | user_id | visits
---------+---------+-------
60 1 5
60 2 3
60 3 1
61 2 4
61 3 2
truy vấn con thứ hai (b) init biến người dùng @prev
với -1 và @count
với 1
sau đó chúng tôi chọn tất cả dữ liệu từ truy vấn con (a) xác minh điều kiện trong case
.
-
xác minh rằng store_id trước đó (
@prev
) chúng tôi đã thấy khác với store_id hiện tại. Kể từ@prev
đầu tiên bằng -1, không có gì phù hợp với store_id hiện tại nên điều kiện<>
là đúng, chúng tôi nhập sau đó là trường hợp thứ hai chỉ phục vụ để thay đổi giá trị@prev
với store_id hiện tại. Đây là mẹo để tôi có thể thay đổi hai biến người dùng@count
và@prev
trong cùng một điều kiện. -
nếu store_id trước đó bằng
@prev
chỉ cần tăng@count
biến. -
chúng tôi kiểm tra xem số lượng có nằm trong giá trị mà chúng tôi muốn không vì vậy
<= 5
Vì vậy, với dữ liệu thử nghiệm của chúng tôi,:
bướcstep | @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