MySQL

2012-10-02 3 views
10

द्वारा समूह में अधिकतम रिकॉर्ड का चयन कर रहा हूं, मैं एक तालिका में एक क्वेरी बनाने की कोशिश कर रहा हूं जिसमें 500,000 रिकॉर्ड और कुछ 50 या 60 कॉलम हैं। मुझे इन रिकॉर्ड्स को समूहों में एकत्रित करने और प्रत्येक समूह में अधिकतम रिकॉर्ड का चयन करने की आवश्यकता है।MySQL

समस्या को आसान बनाने के लिए मैं एक तालिका के रूप

+----+-------------+----------+--------+ 
| id | external_id | group_id | mypath | 
+----+-------------+----------+--------+ 
| 1 |  1003 |  1 | a  | 
| 2 |  1004 |  2 | b  | 
| 3 |  1005 |  2 | c  | 
+----+-------------+----------+--------+ 

सरल समूह के रूप में द्वारा

select * from temp GROUP BY group_id 

जो

+----+-------------+----------+--------+ 
| id | external_id | group_id | mypath | 
+----+-------------+----------+--------+ 
| 1 |  1003 |  1 | a  | 
| 2 |  1004 |  2 | b  | 
+----+-------------+----------+--------+ 

अच्छा नहीं बल्कि जो मैं चाहता रिटर्न इस प्रकार है इस प्रकार है । मैं चाहता हूं कि प्रत्येक समूह में अधिकतम enternal_id के लिए संपूर्ण रिकॉर्ड है। दूसरे शब्दों

+----+-------------+----------+--------+ 
| id | external_id | group_id | mypath | 
+----+-------------+----------+--------+ 
| 1 |  1003 |  1 | a  | 
| 3 |  1005 |  2 | c  | 
+----+-------------+----------+--------+ 

में किसी तरह मैं यहाँ में एक अधिकतम (external_id) बयान डाल करने के लिए फिल्टर करने के लिए क्या जरूरत है, लेकिन अभी तक अपने सभी जांच में नाकाम रही है देख रहा हूँ। कुछ मार्गदर्शन की सराहना की जाएगी। यह महत्वपूर्ण है कि अधिकतम (बाहरी_आईडी) लौटने पर कि पूरे कॉलम को पथ कॉलम के रूप में चुना जाता है।

+0

शायद का उपयोग कर "group_id द्वारा मैक्स (external_id) अधिकतम के रूप में, * चयन अस्थायी ग्रुप से" आप ऐसा कर सकते है। – PiLHA

उत्तर

19

बहुत जानकारी http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

पर यह हमेशा MySQL में एक कष्टप्रद मुद्दा रहा है। इसके आस-पास के तरीके रहे हैं, जैसे कई क्षेत्रों को एक साथ जोड़ना (बाहरी_आईडी से शुरू करना), और उसके बाद MAX() का चयन करना, और फिर इसे अलग करना।

मेरा सुझाव है कि आप व्युत्पन्न तालिका का उपयोग करें। पहली तालिका (टी 1) एक साधारण क्वेरी से ली गई है जहां आप MAX(external_id) की पहचान करते हैं, फिर आप शेष डेटा प्राप्त करने के लिए उससे जुड़ जाते हैं।

यह कार्य तभी external_id अद्वितीय

SELECT 
    t1.group_id, some_table.id, some_table.mypath 
FROM 
    (
     SELECT group_id, MAX(external_id) AS external_id 
     FROM some_table 
     GROUP BY group_id 
    ) as t1 
INNER JOIN 
    sometable ON t1.external_id = sometable.external_id 
WHERE ... 
+0

हाँ आप बिल्कुल सही हैं। समस्या को बदलना सबसे अच्छा तरीका है, मुझे नियम का पालन करना चाहिए था "अगर आपको कोई समस्या है जिसे आप हल नहीं कर सकते हैं, तो इसे बदल सकते हैं"। उपयुक्त इंडेक्स के साथ यह अच्छी तरह से काम करता है। – user1715656

+0

मामूली सवाल, लेकिन क्या कोई कारण है कि आपने कुछ_table.group_id के बजाय t1.group_id का चयन करने के लिए चुना है? क्या यह अधिक कुशल है? –