दिलचस्प पोस्ट
ग्राहक मॉडल का सर्वोत्तम तरीका <-> पता एक संरचना सूचक को दूसरे में कास्टिंग करना – सी दो पूर्णांकों को विभाजित क्यों नहीं एक फ्लोट मिलता है? पायथन थ्रेडिंग एकाधिक बैश उपप्रक्रिया? फ़ंक्शन परिभाषित करने के लिए "def" और "val" के बीच का क्या अंतर है सेलेनियम वेबड्राइवर – यदि तत्व मौजूद है तो टेस्ट करें लैम्ब्डा अभिव्यक्ति में पैरामीटर को बदलें रूबी मणि स्थापित जेसन मावरिक्स और Xcode 5.1 पर विफल रहता है – अज्ञात तर्क: '-मल्टीप्ली_ डिफाइड सुपरप्रेस' HTML5 के साथ रियर कैमरा सक्षम करें LINQ का प्रयोग करके सूचकांक कैसे प्राप्त करें? जावास्क्रिप्ट में डॉलर मुद्रा स्ट्रिंग के रूप में मैं संख्याओं को कैसे प्रारूपित कर सकता हूं? मैं कैसे डॉम को तैयार कर सकता हूं और jQuery के बिना वर्ग जोड़ सकता हूं? मॉड्यूल डिस्क्रिप्टर वर्ग को लोड करने में विफल: कक्षा "com.google.android.gms.dynamite.descriptors.com.google.firebase.auth.ModuleDescriptor" नहीं मिला मूल्य जोड़ों का एक जावा संग्रह? (tuples?) वेब सेवा प्रतिक्रिया के लिए टेक्स्ट / एक्सएमएल बनाम एप्लिकेशन / एक्सएमएल के बीच अंतर क्या है

MySQL "द्वारा समूह" और "आदेश से"

मैं ई-मेल की एक मेज से पंक्तियों का एक गुच्छा चुनने और प्रेषक से उन्हें समूह में सक्षम होना चाहता हूं। मेरी क्वेरी इस तरह दिखती है:

SELECT `timestamp`, `fromEmail`, `subject` FROM `incomingEmails` GROUP BY LOWER(`fromEmail`) ORDER BY `timestamp` DESC 

क्वेरी लगभग काम करता है जैसे मैं चाहता हूं – यह ई-मेल द्वारा वर्गीकृत रिकॉर्ड का चयन करता है समस्या यह है कि विषय और टाइमस्टैम्प एक विशेष ई-मेल पते के लिए सबसे हाल के रिकॉर्ड के अनुरूप नहीं है।

उदाहरण के लिए, यह वापस आ सकता है:

 fromEmail: john@example.com, subject: hello fromEmail: mark@example.com, subject: welcome 

जब डेटाबेस में रिकॉर्ड हैं:

 fromEmail: john@example.com, subject: hello fromEmail: john@example.com, subject: programming question fromEmail: mark@example.com, subject: welcome 

अगर "प्रोग्रामिंग प्रश्न" विषय सबसे हालिया है, तो ई-मेल समूह करते समय मैं उस रिकॉर्ड को चुनने के लिए MySQL कैसे प्राप्त कर सकता हूं?

वेब के समाधान से एकत्रित समाधान "MySQL "द्वारा समूह" और "आदेश से""

एक साधारण समाधान पहले ORDER कथन के साथ एक उप-चयन में प्रश्न को लपेट करना है और बाद में ग्रुप को लागू करना है:

 SELECT * FROM ( SELECT `timestamp`, `fromEmail`, `subject` FROM `incomingEmails` ORDER BY `timestamp` DESC ) AS tmp_table GROUP BY LOWER(`fromEmail`) 

यह शामिल होने का उपयोग करने के समान है, लेकिन बहुत अच्छे दिखता है।

ग्रुप बाय क्लॉज के साथ एक सेलेक्ट में गैर-समस्त कॉलम का उपयोग गैर मानक है। MySQL आमतौर पर पहली पंक्ति के मान वापस लौटाएगा और बाकी को छोड़ देगा। किसी भी आदेश के अनुसार, केवल लौटे हुए कॉलम मूल्य पर लागू होंगे, न त्याग किए गए लोगों के लिए।

महत्वपूर्ण अद्यतन व्यवहार में काम करने के लिए इस्तेमाल किए गए गैर-समस्त स्तंभों का चयन करना, लेकिन इन पर भरोसा नहीं करना चाहिए। MySQL प्रलेखन के अनुसार "यह मुख्य रूप से उपयोगी है जब प्रत्येक गैरगलगित कॉलम में सभी मानों का नाम GROUP BY में नहीं है, प्रत्येक समूह के लिए समान हैं। सर्वर प्रत्येक समूह से किसी भी मूल्य का चयन करने के लिए स्वतंत्र है , इसलिए जब तक कि वे एक समान न हो चुने गए अनिश्चित हैं । "

5.6.21 के रूप में मैंने ऑर्डर द्वारा सॉर्टिंग के बाद अस्थायी तालिका पर ग्रुप BY के साथ समस्याएं देखी हैं I

5.7.5 के रूप में ONLY_FULL_GROUP_BY को डिफ़ॉल्ट रूप से सक्षम किया गया है, यानी गैर-कुल कॉलम का उपयोग करना असंभव है

http://www.cafewebmaster.com/mysql-order-sort-group https://dev.mysql.com/doc/refman/5.6/en/group-by-handling.html https: //dev.mysql देखें .com / doc / RefMan / 5.7 / en / समूह-दर-handling.html

यहां एक दृष्टिकोण है:

 SELECT cur.textID, cur.fromEmail, cur.subject, cur.timestamp, cur.read FROM incomingEmails cur LEFT JOIN incomingEmails next on cur.fromEmail = next.fromEmail and cur.timestamp < next.timestamp WHERE next.timestamp is null and cur.toUserID = '$userID' ORDER BY LOWER(cur.fromEmail) 

मूल रूप से, आप बाद की पंक्तियों के लिए खोज करते हुए स्वयं पर तालिका में शामिल होते हैं जहां खंड में आप यह कहते हैं कि बाद में पंक्तियां नहीं हो सकतीं यह आपको केवल नवीनतम पंक्ति देता है

यदि एक ही टाइमस्टैम्प के साथ कई ईमेल हो सकते हैं, तो इस क्वेरी को रिफाइनिंग की आवश्यकता होगी। अगर ईमेल तालिका में एक वृद्धिशील आईडी कॉलम है, तो JOIN की तरह बदल दें:

 LEFT JOIN incomingEmails next on cur.fromEmail = next.fromEmail and cur.id < next.id 

ग्रुप बी के साथ आपकी क्वेरी को लपेटकर ORDER BY के बाद ग्रुप द्वारा ऐसा करें:

 SELECT t.* FROM (SELECT * FROM table ORDER BY time DESC) t GROUP BY t.from 

एसक्यूएल मानक के अनुसार आप चयन सूची में गैर-समस्त कॉलम का उपयोग नहीं कर सकते हैं। MySQL इस तरह के उपयोग की अनुमति देता है (उलटा केवल ONLY_FULL_GROUP_BY मोड का उपयोग किया जाता है) लेकिन परिणाम पूर्वानुमान नहीं है।

ONLY_FULL_GROUP_BY

आपको सबसे पहले ई-मेल, मिन (पढें) से चयन करना चाहिए, और फिर, दूसरी क्वेरी (या सबक्वायरी) के साथ – विषय

जैसा कि एक उत्तर में पहले से ही बताया गया है, वर्तमान उत्तर गलत है, क्योंकि ग्रुप द्वारा विंडो से रिकॉर्ड का चयन करके मनमाने ढंग से चुना जाता है।

यदि कोई MySQL 5.6, या MySQL 5.7 का उपयोग केवल ONLY_FULL_GROUP_BY साथ कर ONLY_FULL_GROUP_BY , तो सही (निर्धारक) क्वेरी है:

 SELECT incomingEmails.* FROM ( SELECT fromEmail, MAX(timestamp) `timestamp` FROM incomingEmails GROUP BY fromEmail ) filtered_incomingEmails JOIN incomingEmails USING (fromEmail, timestamp) GROUP BY fromEmail, timestamp 

क्वेरी को कुशलतापूर्वक चलाने के लिए, उचित अनुक्रमण की आवश्यकता है।

ध्यान दें कि सरलीकरण उद्देश्यों के लिए, मैंने LOWER() हटा दिया है, जो ज्यादातर मामलों में उपयोग नहीं किया जाएगा

मैं इन दोनों तरीकों से उन जटिल प्रश्नों के लिए संघर्ष किया, जो दिखाए गए हैं की तुलना में अधिक जटिल प्रश्नों के कारण, क्योंकि subquery दृष्टिकोण बेहद अपर्याप्त था, कोई भी इंडेक्स मैं नहीं रखता, और क्योंकि मैं सीतनिद्रा में होना

ऐसा करने का सबसे अच्छा (और सबसे आसान) तरीका समूह के लिए कुछ ऐसा समूह है जिसे आपको आवश्यक फ़ील्ड के संयोजन में शामिल किया गया है और फिर उन्हें SELECT खंड में एक्सप्रेशन का उपयोग करने के लिए खींचें। अगर आपको अधिकतम (MAX) करने की ज़रूरत हो तो सुनिश्चित करें कि जिस क्षेत्र में आप MAX () चाहते हैं, वह हमेशा सम्मिलित इकाई के सबसे महत्वपूर्ण अंत में होता है।

यह समझने की चाबी यह है कि क्वेरी केवल तभी समझ सकती है अगर ये अन्य फ़ील्ड किसी भी इकाई के लिए अपरिवर्तनीय होती हैं जो मैक्स () को संतुष्ट करती है, इसलिए संयोजन के अन्य टुकड़े को अनदेखा किया जा सकता है। यह बताता है कि यह इस लिंक के बहुत नीचे कैसे करें। http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html

यदि आप फ़ील्ड के संयोजन को पूर्व-गणना करने के लिए आप इसे इंडेक्स कर सकते हैं / अपडेट इवेंट (ट्रिगर की तरह) प्राप्त कर सकते हैं और क्वेरी उतनी ही तेजी से होगी जितनी कि समूह केवल उस फ़ील्ड पर था जिसकी आप वास्तव में MAX चाहते थे ( )। आप अधिकतम फ़ील्ड के अधिकतम प्राप्त करने के लिए इसका उपयोग भी कर सकते हैं। मैं नेस्टेड सेट के रूप में व्यक्त बहु-आयामी पेड़ों के विरुद्ध क्वेरी करने के लिए इसका उपयोग करता हूं।