2つのユーザー変数を使用し、同じ連続するstore_idをカウントすると、<= 5
を置き換えることができます。 好きな制限で
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
説明の要求に応じて編集:
最初のサブクエリ(a)は、データをグループ化して順序付けするサブクエリであり、次のようなデータが得られます。
store_id | user_id | visits
---------+---------+-------
60 1 5
60 2 3
60 3 1
61 2 4
61 3 2
2番目のサブクエリ(b)はユーザー変数@prev
を初期化します -1と@count
1で
次に、サブクエリからすべてのデータを選択します(a)case
の条件を確認します 。
-
前のstore_id(
@prev
)これまで見てきたのは、現在のstore_idとは異なります。最初の@prev
以降 -1に等しい場合、現在のstore_idに一致するものはないため、条件<>
真の場合、入力するのは、値@prev
を変更するだけの2番目のケースです。 現在のstore_idを使用します。これは、2つのユーザー変数@count
を変更できるようにするためのトリックです。 および@prev
同じ状態で。 -
前のstore_idが
@prev
と等しい場合@count
をインクリメントするだけです 変数。 -
カウントが必要な値の範囲内にあることを確認するため、
<= 5
したがって、テストデータを使用すると:
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