कॉलम मूल्य प्रति 1 का चयन करें?


11

कहते हैं, मेरे पास निम्न तालिका है

-----------------------------
| user_id   | comment       |
-----------------------------
| 2         | thats cool    |
| 2         | awesome       |
| 3         | i hate this   |
| 3         | okay          |
| 6         | this is weird |
| 6         | hello?        |
| 6         | what is it    |
| 9         | how are you   |
| 16        | too slow      |
| 16        | yes           |
| 17        | alrighty      |
-----------------------------

आप प्रति पंक्ति एक पंक्ति का चयन कैसे कर सकते हैं user_id? तो मेरे परिणाम होंगे:

-----------------------------
| user_id   | comment       |
-----------------------------
| 2         | thats cool    |
| 3         | i hate this   |
| 6         | this is weird |
| 9         | how are you   |
| 16        | too slow      |
| 17        | alrighty      |
-----------------------------

क्या यह एकल कुशल क्वेरी से संभव है? या उप-चयनित आवश्यक हैं? क्या किसी DISTINCTएक स्तंभ पर किसी तरह उपयोग करना संभव है ?

जवाबों:


9

इसका GROUP BYउपयोग इसके लिए किया जाता है। एक पंक्ति (प्रति समूह) प्राप्त करें। इस मामले में, यह सब अलग दिखाएगा user_idमूल्यों और शेष कॉलमों के लिए, आप (है) कर सकते हैं की तरह कुल कार्यों का उपयोग MIN(), MAX(), AVG(), SUM()के रूप में आप समूह में एक से अधिक मान होगा और केवल एक ही दिखाया जा सकता है।

SELECT
    user_id
  , MIN(comment) AS comment  -- it will show the first in alphabetical order  
                             -- you could also use MAX()
FROM
    tableX
GROUP BY
    user_id ;

MySQL भी निम्नलिखित अपरंपरागत समाधान की अनुमति देता है, जो प्रति उपयोगकर्ता एक (कम या अधिक यादृच्छिक) टिप्पणी लौटाएगा:

SELECT
    user_id
  , comment
FROM
    tableX
GROUP BY
    user_id ;

यह अंतिम क्वेरी काम नहीं करेगी लेकिन यदि (स्ट्रिकटर) ONLY_FULL_GROUP_BYमोड सक्षम है तो एक त्रुटि बढ़ाएँ । हाल ही में जारी 5.7 संस्करण में, यह मोड डिफ़ॉल्ट है और एक नया फ़ंक्शन है, ANY_VALUE()प्रदान किया गया है। अधिक जानकारी के लिए, पृष्ठ का MySQL हैंडलिंगGROUP BY देखें । क्वेरी अब लिखी जा सकती है:

SELECT
    user_id
  , ANY_VALUE(comment) AS comment
FROM
    tableX
GROUP BY
    user_id ;

ध्यान दें कि या तो "अपरंपरागत" संस्करण के साथ या हाल ही के ANY_VALUE()फ़ंक्शन का उपयोग करते हुए , यदि हम SELECTसूची में अधिक कॉलम जोड़ते हैं, तो उनके मान एक ही पंक्ति से एक ही समूह में होने की गारंटी नहीं है। जिस तरह से उन्हें चुना गया है वह बिल्कुल यादृच्छिक नहीं है, निष्पादन योजना और उपयोग किए गए अनुक्रमों पर निर्भर करता है।


क्या यह निर्दिष्ट करने के कोई अन्य तरीके हैं कि उपयोगकर्ता के लिए कौन सी पंक्ति खींची जाती है? किसी भी तरह से एक आदेश निर्दिष्ट करने का कोई तरीका?
जेक विल्सन

इसके अलावा MINऔर MAX?
ypercube y

1
तब यह अधिक जटिल है। इस अन्य प्रश्न को देखें: MySQL Query - सबसे हालिया जनसांख्यिकी कैसे प्राप्त करें?
ypercube y

2
आपको [greatest-n-per-group]टैग के तहत SO साइट में समान समस्याओं का एक टन मिलेगा ।
ypercube y

1
@ T.BrianJones का अर्थ है "अपरंपरागत" क्वेरी में, यदि आप चयन सूची में अन्य सभी कॉलम जोड़ते हैं? यह पहला है, वे एक ही पंक्ति से नहीं हो सकते हैं। यह बिल्कुल यादृच्छिक नहीं है, लेकिन मूल्य अलग-अलग पंक्तियों (एक ही समूह से) हो सकते हैं।
ypercube y
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.