2012-10-27 15 views
8

चलें कहते हैं कि मैं एक संयंत्र तालिका है:ऑर्डर द्वारा ऑर्डर में कुल कार्य क्या कर सकता है?

id fruit 
1 banana 
2 apple 
3 orange 

मैं इन

SELECT * FROM plant ORDER BY id; 
SELECT * FROM plant ORDER BY fruit DESC; 

जो स्पष्ट बात करता है क्या कर सकते हैं।

लेकिन मुझे इसकाट दिया गया, यह क्या करता है?

SELECT * FROM plant ORDER BY SUM(id); 
SELECT * FROM plant ORDER BY COUNT(fruit); 
SELECT * FROM plant ORDER BY COUNT(*); 
SELECT * FROM plant ORDER BY SUM(1) DESC; 

ये सभी केवल पहली पंक्ति (आईडी = 1 के साथ) लौटते हैं।

  1. क्या हो रहा है?
  2. परिदृश्य क्या हैं जहां कुल कार्य ORDER BY में आसान होगा?

उत्तर

12

आपका परिणाम और अधिक स्पष्ट कर रहे हैं यदि आप वास्तव में तालिका में कॉलम के बजाय समस्त मानों का चयन करें:

SELECT SUM(id) FROM plant ORDER BY SUM(id) 

यह सब आईडी के की राशि वापस आ जाएगी। यह निश्चित रूप से एक बेकार उदाहरण है क्योंकि एकत्रीकरण हमेशा एक पंक्ति बनायेगा, इसलिए आदेश देने की कोई आवश्यकता नहीं है। आपकी क्वेरी में पंक्ति qith कॉलम प्राप्त करने का कारण यह है कि MySQL एक पंक्ति चुनता है, यादृच्छिक रूप से नहीं बल्कि निर्धारिती भी। ऐसा ही होता है कि यह आपके मामले में तालिका में पहला स्तंभ है, लेकिन अन्य स्टोरेज इंजन, प्राथमिक कुंजी आदि के आधार पर एक और पंक्ति प्राप्त कर सकते हैं। धारा द्वारा ऑर्डर में केवल एकत्रीकरण बहुत उपयोगी नहीं है।

क्या आप आमतौर पर क्या करना चाहते हैं एक निश्चित क्षेत्र द्वारा समूहीकरण है और उसके बाद परिणाम किसी तरह से सेट आदेश:

SELECT fruit, COUNT(*) 
FROM plant 
GROUP BY fruit 
ORDER BY COUNT(*) 

अब जब कि एक और अधिक दिलचस्प क्वेरी है! यह आपको फल के लिए कुल गणना के साथ प्रत्येक फल के लिए एक पंक्ति देगा। कुछ और सेब जोड़ने का प्रयास करें और आदेश वास्तव में बनाने भावना शुरू कर देंगे:

पूरा तालिका:

+----+--------+ 
| id | fruit | 
+----+--------+ 
| 1 | banana | 
| 2 | apple | 
| 3 | orange | 
| 4 | apple | 
| 5 | apple | 
| 6 | banana | 
+----+--------+ 

क्वेरी से ऊपर:

+--------+----------+ 
| fruit | COUNT(*) | 
+--------+----------+ 
| orange |  1 | 
| banana |  2 | 
| apple |  3 | 
+--------+----------+ 
+0

उत्कृष्ट स्पष्टीकरण, धन्यवाद! – nawfal

2
  1. आप ऐसा एक समग्र उपयोग करते हैं, क्वेरी एक निहित समूह प्राप्त करती है जहां पूरा परिणाम एक समूह है।

  2. क्रम में कुल मिलाकर उपयोग करना केवल तभी उपयोगी होता है जब आपके पास समूह भी हो, ताकि परिणामस्वरूप आप एक से अधिक पंक्ति प्राप्त कर सकें।

2

ये सभी प्रश्न आपको SQL सर्वर मानकों का अनुपालन करने वाले किसी भी SQL प्लेटफॉर्म पर सिंटैक्स त्रुटि प्रदान करेंगे।

SELECT * FROM plant ORDER BY SUM(id); 
SELECT * FROM plant ORDER BY COUNT(fruit); 
SELECT * FROM plant ORDER BY COUNT(*); 
SELECT * FROM plant ORDER BY SUM(1) DESC; 

PostgreSQL पर, उदाहरण के लिए, उन सभी प्रश्नों में एक ही त्रुटि होगी।

ERROR: column "plant.id" must appear in the GROUP BY clause or be used in an aggregate function

इसका मतलब है कि आप GROUP BY का उपयोग किये बिना डोमेन समेकित फ़ंक्शन का उपयोग कर रहे हैं। एसक्यूएल सर्वर और ओरेकल समान त्रुटि संदेश लौटते हैं।

माईएसक्यूएल ग्रुप बी को कम से कम मानक व्यवहार के संबंध में कई मामलों में तोड़ने के लिए जाना जाता है। लेकिन आपके द्वारा पोस्ट किए गए प्रश्न मेरे लिए एक नया टूटा व्यवहार था, इसलिए इसके लिए +1।

यह समझने की कोशिश करने के बजाय कि यह हुड के तहत क्या कर रहा है, आप शायद मानक ग्रुप बाय प्रश्नों को लिखने के लिए सीखने से बेहतर हैं। जहां तक ​​मुझे पता है, MySQL प्रक्रिया मानक ग्रुप बाय स्टेटमेंट सही तरीके से करेगा।

MySQL दस्तावेज़ों के पहले संस्करणों ने आपको ग्रुप बाय और छुपा कॉलम के बारे में चेतावनी दी थी। (मैं एक संदर्भ नहीं है, लेकिन इस पाठ हर जगह उद्धृत किया जाता है।)

Do not use this feature if the columns you omit from the GROUP BY part are not constant in the group. The server is free to return any value from the group, so the results are indeterminate unless all values are the same.

More recent versions are a little different

You can use this feature to get better performance by avoiding unnecessary column sorting and grouping. However, this is useful primarily when all values in each nonaggregated column not named in the GROUP BY are the same for each group. The server is free to choose any value from each group, so unless they are the same, the values chosen are indeterminate.

व्यक्तिगत रूप से, मैं अनिश्चित एसक्यूएल में एक सुविधा पर विचार नहीं करते।

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