2011-01-28 17 views
13

के अधिकतम मूल्य के आधार पर MySQL से पंक्तियों का चयन कैसे करें मेरे पास एक सारणी है जिसमें उपयोगकर्ता ने एक विशिष्ट वेबपृष्ठ को देखा है (चलो कहें)। उपयोगकर्ता पाठ्यक्रम के एक पेज पर एक से अधिक बार देख सकते हैं, इसलिए वहाँ उन और पृष्ठों के लिए कई प्रविष्टियाँ, इसलिए की तरह हो सकता है:कॉलम + ग्रुपिंग

nid  time user page_id 
25  8000  4  467 
24  7000  1  482 
23  6000  1  484 
22  5000  1  482 
21  4000  5  467 
20  3000  4  467 

मैं एक प्रश्न है कि पंक्तियों हर द्वारा देखी हर पृष्ठ के लिए इसी रिटर्न क्या करना चाहते हैं कैश के साथ उपयोगकर्ता यह है कि यदि कोई उपयोगकर्ता एक से अधिक बार एक पृष्ठ को देखता है, तो मुझे सबसे हालिया दृश्य (यानी, TIME का सबसे बड़ा मूल्य) के अनुरूप पंक्ति मिलती है। इस प्रकार, मैं इस मिलना चाहिए:

nid  time user page_id 
25  8000  4  467 
24  7000  1  482 
23  6000  1  484 
21  4000  5  467 

हम पंक्ति 22 खोना क्योंकि उपयोगकर्ता 1 बाद में पेज 482 को देखा, और हम लगातार 20 खोना क्योंकि उपयोगकर्ता 4 बाद में पेज 467 को देखा।

मुझे लगभग यह पता चला है, लेकिन मैं इसे काफी क्रैक नहीं कर सकता, जबकि मुझे यह भी विश्वास दिलाता हूं कि मुझे जो परिणाम मिल रहे हैं वह आम तौर पर सही होगा और न केवल मेरे परीक्षण मामलों का दुर्घटना होगा। मैं ग्रुप बाय या डिस्टिंट क्वेरी और एम्बेडेड प्रश्नों के बीच आगे और आगे बढ़ता रहता हूं, और फिर मेरा दिमाग विस्फोट करता है। कोई सुझाव? धन्यवाद!

+0

डुप्लीकेट प्रश्न [http: // stackoverflow.com/questions/612231/how-can-i-select-rows-with-maxcolumn-value-distinct-by-another-column-in-sql] – user1486030

उत्तर

19

आप पूर्ण पंक्ति की जरूरत है तो आप इस का उपयोग कर सकते इस समूह के अंदर इस कॉलम के लिए कोई मूल्य वापस कर सकते हैं। इसलिए यदि समूह के अंदर सभी मान समान नहीं हैं, तो यह आपका मामला है, आप इसे सीधे क्लॉज पर शामिल नहीं कर सकते हैं, आपको एक जॉइन का उपयोग करने की आवश्यकता है।

आप अधिक पढ़ सकते हैं के बारे में आप एनआईडी क्षेत्र की जरूरत नहीं है the reference

पर MySQL पर कॉलम समूहीकृत नहीं, तो आप इस अन्य उपयोग कर सकते हैं:

SELECT MAX(time) as time, user, page_id 
    FROM TableName 
GROUP BY user, page_id 
ORDER BY time DESC 
+0

हाँ, यह सही बात है। बहुत बहुत धन्यवाद! मुझे शायद यह उल्लेख करना चाहिए था कि मुझे एनआईडी क्षेत्र की आवश्यकता है; मैं आपके दूसरे, एनआईडी-कम उदाहरण के लिए प्राप्त हुआ था, लेकिन जैसा कि उल्लेख किया गया है, पर्याप्त नहीं है। अपना उत्तर चिह्नित करना और इसकी पुष्टि करना क्योंकि उत्तर का पालन किया जाएगा; मैं खुद को सही ढंग से पहचानने के लिए पांच अंक भी दे रहा हूं कि मैंने कभी भी यह काम नहीं किया होगा ... –

1

इस प्रयास करें:

SELECT fullTable.nid as nid, 
     recent.time as time, 
     fullTable.user as user, 
     fullTable.page_id as page_id 
    FROM TableName fullTable 
     INNER JOIN (SELECT MAX(t1.time) as time, t1.user, t1.page_id 
         FROM TableName t1 
        GROUP BY user, page_id) recent 
       ON recent.time = fullTable.time AND 
        recent.user = fullTable.user AND 
        recent.page_id = fullTable.page_id 
ORDER BY time DESC 

यदि आप खंड "द्वारा समूह" के बाहर एक स्तंभ के लिए पूछना, mysql:

SELECT * 
    FROM <YOUR_TABLE> 
WHERE (user, page_id, time) IN 
    (
    SELECT user, page_id, MAX(time) time 
     FROM <YOUR_TABLE> 
    GROUP BY user, page_id 
    ) 
0
SELECT nid, MAX(time), user, page_id 
FROM TableName 
GROUP BY nid, user, page_id 
संबंधित मुद्दे