2013-03-13 12 views
14

मेरे पास निम्न तालिका कहा जाता है प्रश्न:कैसे समूह के लिए DESC द्वारा आदेश

ID | asker 
1 | Bob 
2 | Bob 
3 | Marley 

मैं केवल एक बार प्रत्येक प्रश्नकर्ता का चयन करना चाहते हैं और अगर वहाँ एक ही नाम के साथ कई askers कर रहे हैं, उच्चतम आईडी से एक का चयन । तो, अपेक्षित परिणाम:

ID | asker 
3 | Marley 
2 | Bob 

मैं निम्न क्वेरी का उपयोग:

SELECT * FROM questions GROUP by questions.asker ORDER by questions.id DESC 

मैं निम्नलिखित परिणाम प्राप्त:

ID | asker 
3 | Marley 
1 | Bob 

तो यह पहली 'बॉब' का चयन करता है यह बजाय सामना करना पड़ता है आखिरी में से

धन्यवाद

+0

प्रश्न: क्या आपका आईडी कॉलम INTERGERS या VARCHAR के रूप में सेट है? –

+0

ऑटो वृद्धि पूर्णांक –

उत्तर

25

आप प्रत्येक asker के लिए पिछले id चाहते हैं, तो आप एक समग्र समारोह का उपयोग करना चाहिए:

SELECT max(id) as id, 
    asker 
FROM questions 
GROUP by asker 
ORDER by id DESC 

कारण आप असामान्य परिणाम प्राप्त कर रहे थे क्योंकि MySQL GROUP BY पर एक एक्सटेंशन का उपयोग करता है जो किसी चयनित सूची में आइटम्स को गैर-समेकित करने की अनुमति देता है और ग्रुप बाय क्लॉज में शामिल नहीं होता है। हालांकि यह अप्रत्याशित परिणाम हो सकता है क्योंकि MySQL लौटाए गए मानों का चयन कर सकता है। (MySQL Extensions to GROUP BY देखें)

MySQL डॉक्स से:

MySQL ताकि चयन सूची nonaggregated कॉलम GROUP BY क्लॉज़ में नामित नहीं का उल्लेख कर सकते द्वारा समूह के उपयोग फैली हुई है। ... आप अनावश्यक कॉलम सॉर्टिंग और ग्रुपिंग से बचकर बेहतर प्रदर्शन प्राप्त करने के लिए इस सुविधा का उपयोग कर सकते हैं। हालांकि, यह मुख्य रूप से उपयोगी होता है जब ग्रुप BY में नामित प्रत्येक गैर-समेकित कॉलम में सभी मान प्रत्येक समूह के लिए समान नहीं होते हैं। सर्वर प्रत्येक समूह से किसी भी मूल्य का चयन करने के लिए स्वतंत्र है, इसलिए जब तक वे समान नहीं हैं, तो चुने गए मान अनिश्चित हैं। इसके अलावा, प्रत्येक समूह के मूल्यों का चयन खंड द्वारा ऑर्डर जोड़कर प्रभावित नहीं हो सकता है। परिणाम सेट का क्रमबद्ध होना मानों के चयन के बाद होता है, और ORDER BY यह प्रभावित नहीं करता कि सर्वर कौन से मान चुनता है।

+0

मेरे साथ काम नहीं कर रहे – itsazzad

+0

@itsazzad आपका क्या मतलब है "मेरे लिए काम नहीं कर रहा"? यह किसी समस्या का सबसे वर्णनात्मक स्पष्टीकरण नहीं है। – Taryn

+2

यदि मैं 'SELECT *, अधिकतम (आईडी) आईडी के रूप में उपयोग करता हूं तो यह सही परिणाम नहीं दे रहा है – itsazzad

2

रिकॉर्ड GROUP BY और MAX() का उपयोग कर हर asker के लिए अधिकतम आईडी प्राप्त करने के लिए बांटा जा करने की जरूरत है।

SELECT asker, MAX(ID) ID 
FROM TableName 
GROUP BY asker 

आउटपुट

╔════════╦════╗ 
║ ASKER ║ ID ║ 
╠════════╬════╣ 
║ Bob ║ 2 ║ 
║ Marley ║ 3 ║ 
╚════════╩════╝ 
+0

हालांकि आप प्रत्येक आईडी के लिए अधिकतम आईडी कैसे प्राप्त करते हैं? – fungusanthrax

1

अन्य परिणाम प्राप्त करने के लिए MAX (आईडी) का उपयोग करने के बारे में सही हैं। यदि आप सोच रहे हैं कि आपकी क्वेरी क्यों काम नहीं करती है, तो ऐसा इसलिए है क्योंकि ORDER BYGROUP BY के बाद होता है।

15

आम तौर पर MySQL समूह को आरोही क्रम रिकॉर्ड द्वारा अनुमति देता है। इसलिए हम समूहबद्ध करने से पहले रिकॉर्ड ऑर्डर कर सकते हैं।@bluefeet के जवाब का

SELECT * FROM questions 
WHERE id IN 
(SELECT max(id) as id, asker 
FROM questions 
GROUP by asker 
ORDER by id DESC) 

उन्नत संस्करण:

 
SELECT * 
FROM (
    SELECT * 
    FROM questions 
    ORDER BY id DESC 
) AS questions 
GROUP BY questions.asker 
0

प्रत्येक स्तंभ प्राप्त करने के लिए।

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