दो उपयोगकर्ता चर का उपयोग करके और एक ही लगातार 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
अनुरोध के अनुसार कुछ स्पष्टीकरण संपादित करें:
पहला सबक्वेरी (ए) वह है जो डेटा को समूह और ऑर्डर करता है ताकि आपके पास डेटा होगा:
store_id | user_id | visits
---------+---------+-------
60 1 5
60 2 3
60 3 1
61 2 4
61 3 2
दूसरा सबक्वेरी (बी) उपयोगकर्ता चर @prev
में प्रवेश करें -1 और @count
. के साथ 1
फिर हम सबक्वेरी से सभी डेटा चुनते हैं (ए) case
. में स्थिति की पुष्टि करते हुए ।
-
सत्यापित करें कि पिछला store_id (
@prev
.) ) हमने देखा है कि वर्तमान store_id से अलग है। चूंकि पहले@prev
-1 के बराबर है वर्तमान store_id से मेल खाने वाला कुछ भी नहीं है इसलिए स्थिति<>
यह सच है कि हम दर्ज करते हैं तो दूसरा मामला है जो सिर्फ मूल्य बदलने के लिए काम करता है@prev
वर्तमान store_id के साथ। यह चाल है इसलिए मैं दो उपयोगकर्ता चर बदल सकता हूं@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