2011-01-11 10 views
6

मेरे पास एक सारणी है जो इस तरह दिखती है: comment_id, user_id, टिप्पणी, last_updated।मैं प्रत्येक उपयोगकर्ता के लिए 5 नवीनतम टिप्पणियां (SQL सर्वर के लिए SQL क्वेरी) कैसे प्राप्त करूं?

टिप्पणी_आईडी यहां एक कुंजी है। प्रत्येक उपयोगकर्ता के पास कई टिप्पणियां हो सकती हैं।

मैं प्रत्येक उपयोगकर्ता के लिए 5 नवीनतम टिप्पणियां (SQL सर्वर के लिए SQL क्वेरी) कैसे प्राप्त करूं?

आउटपुट मूल तालिका के समान होना चाहिए, बस उपयोगकर्ता की टिप्पणियों को प्रत्येक उपयोगकर्ता के लिए 5 सबसे हाल ही में सीमित करें।

उत्तर

10

कम से कम SQL सर्वर 2005 पर मान लिया जाये तो तुम खिड़की समारोह (row_number) और CTE उपयोग कर सकते हैं:

;with cteRowNumber as (
    select comment_id, user_id, comment, last_updated, ROW_NUMBER() over (partition by user_id order by last_updated desc) as RowNum 
     from comments 
) 
select comment_id, user_id, comment, last_updated 
    from cteRowNumber 
    where RowNum <= 5 
    order by user_id, last_updated desc 
+0

धन्यवाद। मुझे लगता है कि यह ठीक काम करता है। क्या यह मानक SQL वाक्यविन्यास के साथ ROW_NUMBER() के बिना किया जा सकता है? – myforums

+0

आप चुनिंदा कथन के साथ cteRowNumber से प्रतिस्थापित कर सकते हैं। – JeffO

+2

@myforums: यह ** आईएस ** मानक एएनएसआई एसक्यूएल वाक्यविन्यास है! –

0
SELECT TOP 5 * FROM table WHERE user_id = x ORDER BY comment_id ASC 

मुझे लगता है कि इसे करना चाहिए।

+0

यह मेरे उपयोगकर्ता केवल 1 के लिए नवीनतम टिप्पणियाँ, सही दे देंगे? मुझे प्रत्येक उपयोगकर्ता के लिए 5 नवीनतम टिप्पणियों की आवश्यकता है। – myforums

+0

"प्रत्येक उपयोगकर्ता के लिए" शायद इसका मतलब है कि वह * सभी * उपयोगकर्ताओं के लिए एक बार में डेटा चाहता है, केवल एक उपयोगकर्ता के लिए नहीं। – dkarp

+0

यह ** एक उपयोगकर्ता ** की 5 सबसे पुरानी (एएससी) टिप्पणियों को वापस नहीं करेगा? क्या आप टाइमस्टैम्प डीईएससी का उपयोग नहीं करना चाहिए? – Nishant

0

SqlServer 2005 में, आप LIMIT मान्य नहीं है।

इसके बजाय, की तरह कुछ कार्य करें:

SELECT TOP(5) * FROM Comment WHERE user_id = x ORDER BY comment_id ASC 

नोट इस मानता है कि कि comment_id होगा- बढ़ती जा रही है, जो हमेशा पहचान फ़ील्ड के लिए एक वैध धारणा नहीं हो सकता है (अगर वे उदाहरण के लिए renumbered जाने की जरूरत है)। आप एक वैकल्पिक क्षेत्र पर विचार करना चाह सकते हैं, लेकिन बुनियादी संरचना एक जैसी होगी।

ध्यान दें कि यदि आप किसी दिनांक फ़ील्ड द्वारा ऑर्डर कर रहे थे, तो आप आरोही क्रम के बजाय अवरोही क्रम में क्रमबद्ध करना चाहते हैं, उदा।

SELECT TOP(5) * FROM Comment WHERE user_id = x ORDER BY last_updated DESC 
+0

"प्रत्येक उपयोगकर्ता के लिए" शायद इसका मतलब है कि वह * सभी * उपयोगकर्ताओं के लिए एक बार में डेटा चाहता है, केवल एक उपयोगकर्ता के लिए नहीं। – dkarp

2

जो जवाब एसक्यूएल सर्वर में ऐसा करने का सबसे अच्छा तरीका है (कम से कम, मुझे लगता है यह है, मैं सीटीई से परिचित नहीं हूँ)। लेकिन यहाँ एक समाधान (बहुत तेजी से नहीं है!) है मानक SQL का उपयोग कर:

SELECT * FROM comments c1 
    WHERE (SELECT COUNT(*) FROM comments c2 
      WHERE c2.user_id = c1.user_id AND c2.last_updated >= c1.updated) <= 5 
+0

इस समाधान के लिए भी धन्यवाद। – myforums

संबंधित मुद्दे