MySQL में, आप GROUP_CONCAT()
का उपयोग करके अपने क्वेरी परिणामों को अल्पविराम से अलग की गई सूची के रूप में वापस कर सकते हैं समारोह।
GROUP_CONCAT()
फ़ंक्शन विशेष रूप से एक अल्पविराम, या आपकी पसंद के एक सीमांकक द्वारा अलग की गई सूची में सेट किए गए क्वेरी के परिणाम को संयोजित करने के उद्देश्य से बनाया गया था।
यह लेख इस बात का उदाहरण देता है कि यह सब कैसे काम करता है।
डेटा
सबसे पहले, आइए अपने पहले कुछ उदाहरणों में निम्नलिखित डेटा का उपयोग करें:
USE Solutions; SELECT TaskName FROM Tasks;
परिणाम:
+-------------------+ | TaskName | +-------------------+ | Do garden | | Feed cats | | Paint roof | | Take dog for walk | | Relax | | Feed cats | +-------------------+
मूल उदाहरण
GROUP_CONCAT()
को प्रदर्शित करने के लिए यहां एक बुनियादी उदाहरण दिया गया है समारोह:
SELECT GROUP_CONCAT(TaskName) FROM Tasks;
परिणाम:
+------------------------------------------------------------------+ | GROUP_CONCAT(TaskName) | +------------------------------------------------------------------+ | Do garden,Feed cats,Paint roof,Take dog for walk,Relax,Feed cats | +------------------------------------------------------------------+
जैसा कि आप देख सकते हैं, परिणाम सेट से प्रत्येक पंक्ति को एक पंक्ति में संयोजित किया गया है। डिफ़ॉल्ट रूप से, सूची को अल्पविराम द्वारा अलग किया जाता है।
ध्यान दें कि यह सूची कितनी लंबी हो सकती है, इस पर प्रतिबंध हैं। इसके बारे में बाद में लेख में।
उदाहरण - DISTINCT
आप DISTINCT
. का उपयोग कर सकते हैं डुप्लिकेट को हटाने के लिए (ताकि डुप्लिकेट रिकॉर्ड एक रिकॉर्ड बन जाएं)।
उदाहरण:
SELECT GROUP_CONCAT(DISTINCT TaskName) FROM Tasks;
परिणाम:
+--------------------------------------------------------+ | GROUP_CONCAT(DISTINCT TaskName) | +--------------------------------------------------------+ | Do garden,Feed cats,Paint roof,Relax,Take dog for walk | +--------------------------------------------------------+
तो इस मामले में, "फ़ीड कैट" केवल एक बार सूचीबद्ध है, जबकि इसे पिछले उदाहरण में दो बार सूचीबद्ध किया गया था।
उदाहरण - द्वारा ऑर्डर करें
आप ORDER BY
. का उपयोग कर सकते हैं किसी दिए गए कॉलम द्वारा परिणामों को क्रमित करने के लिए।
उदाहरण:
SELECT GROUP_CONCAT(DISTINCT TaskName ORDER BY TaskName DESC) FROM Tasks;
परिणाम:
+--------------------------------------------------------+ | GROUP_CONCAT(DISTINCT TaskName ORDER BY TaskName DESC) | +--------------------------------------------------------+ | Take dog for walk,Relax,Paint roof,Feed cats,Do garden | +--------------------------------------------------------+
तो इस मामले में मैं DESC
. का उपयोग करता हूं यह निर्दिष्ट करने के लिए कि यह अवरोही क्रम में होना चाहिए। वैकल्पिक (और डिफ़ॉल्ट) मान ASC
है आरोही के लिए।
उदाहरण - एक सीमांकक निर्दिष्ट करें
डिफ़ॉल्ट रूप से, सूची अल्पविराम से अलग की गई सूची है। हालांकि, यदि आवश्यक हो तो आप अपनी पसंद का एक सीमांकक निर्दिष्ट कर सकते हैं।
ऐसा करने के लिए, SEPARATOR
का उपयोग करें इसके बाद स्ट्रिंग शाब्दिक मान होता है जिसे समूह मानों के बीच सम्मिलित किया जाना चाहिए।
उदाहरण:
SELECT GROUP_CONCAT(DISTINCT TaskName SEPARATOR ' + ') FROM Tasks;
परिणाम:
+----------------------------------------------------------------+ | GROUP_CONCAT(DISTINCT TaskName SEPARATOR ' + ') | +----------------------------------------------------------------+ | Do garden + Feed cats + Paint roof + Relax + Take dog for walk | +----------------------------------------------------------------+
उदाहरण - स्तंभों का संयोजन
आप कॉलम को जोड़ भी सकते हैं, और एक स्ट्रिंग शाब्दिक मान प्रदान करके अपना विभाजक प्रदान कर सकते हैं।
उदाहरण:
SELECT GROUP_CONCAT(TaskId, ') ', TaskName SEPARATOR ' ') FROM Tasks;
परिणाम:
+------------------------------------------------------------------------------------+ | GROUP_CONCAT(TaskId, ') ', TaskName SEPARATOR ' ') | +------------------------------------------------------------------------------------+ | 1) Do garden 2) Feed cats 3) Paint roof 4) Take dog for walk 5) Relax 6) Feed cats | +------------------------------------------------------------------------------------+
इस उदाहरण में हम दोनों TaskId
. लौटाते हैं कॉलम और TaskName
कॉलम, एक बंद कोष्ठक और एक स्थान द्वारा अलग किया गया। हम SEPARATOR
. का भी उपयोग करते हैं यह निर्दिष्ट करने के लिए तर्क कि प्रत्येक (संबद्ध) पंक्ति के बीच उपयोग किया जाने वाला सीमांकक एक स्थान (डिफ़ॉल्ट अल्पविराम के बजाय) होना चाहिए।
समूहीकृत परिणाम
GROUP_CONCAT()
फ़ंक्शन उन अवसरों के लिए उपयोगी हो सकता है जहां आप परिणामों की एक सूची प्रदान करना चाहते हैं, जो किसी अन्य कॉलम द्वारा समूहीकृत है।
उदाहरण के लिए, हो सकता है कि आप कलाकारों की एक सूची चाहते हों, जिसमें प्रत्येक कलाकार के बाद उनके द्वारा जारी किए गए एल्बमों की सूची हो।
इसे प्रदर्शित करने के लिए, मान लें कि हमारे पास दो तालिकाओं वाला डेटाबेस है; Artists
और Albums
. इन तालिकाओं के बीच एक से अनेक संबंध हैं। प्रत्येक कलाकार के लिए कई एल्बम हो सकते हैं।
तो दोनों तालिकाओं को जोड़ने वाली एक नियमित क्वेरी कुछ इस तरह दिख सकती है:
USE Music; SELECT ar.ArtistName, al.AlbumName FROM Artists ar INNER JOIN Albums al ON ar.ArtistId = al.ArtistId;
परिणाम:
+------------------------+--------------------------+ | ArtistName | AlbumName | +------------------------+--------------------------+ | Iron Maiden | Powerslave | | AC/DC | Powerage | | Jim Reeves | Singing Down the Lane | | Devin Townsend | Ziltoid the Omniscient | | Devin Townsend | Casualties of Cool | | Devin Townsend | Epicloud | | Iron Maiden | Somewhere in Time | | Iron Maiden | Piece of Mind | | Iron Maiden | Killers | | Iron Maiden | No Prayer for the Dying | | The Script | No Sound Without Silence | | Buddy Rich | Big Swing Face | | Michael Learns to Rock | Blue Night | | Michael Learns to Rock | Eternity | | Michael Learns to Rock | Scandinavia | | Tom Jones | Long Lost Suitcase | | Tom Jones | Praise and Blame | | Tom Jones | Along Came Jones | | Allan Holdsworth | All Night Wrong | | Allan Holdsworth | The Sixteen Men of Tain | +------------------------+--------------------------+
जैसा कि आप देख सकते हैं, इस प्रारूप का उपयोग करते समय, यदि किसी कलाकार के पास एक से अधिक एल्बम हैं, तो वह कलाकार कई बार सूचीबद्ध होता है - प्रत्येक एल्बम के लिए एक बार।
हम इस क्वेरी को संशोधित कर सकते हैं ताकि प्रत्येक कलाकार केवल एक बार सूचीबद्ध हो। यदि किसी कलाकार के पास एक से अधिक एल्बम हैं, तो सभी एल्बम अल्पविराम से अलग की गई सूची में एक ही फ़ील्ड में प्रदर्शित होते हैं। हम GROUP_CONCAT()
. की बदौलत ऐसा कर सकते हैं समारोह।
उदाहरण:
USE Music; SELECT ar.ArtistName, GROUP_CONCAT(al.AlbumName) FROM Artists ar INNER JOIN Albums al ON ar.ArtistId = al.ArtistId GROUP BY ArtistName;
परिणाम:
+------------------------+----------------------------------------------------------------------------+ | ArtistName | GROUP_CONCAT(al.AlbumName) | +------------------------+----------------------------------------------------------------------------+ | AC/DC | Powerage | | Allan Holdsworth | All Night Wrong,The Sixteen Men of Tain | | Buddy Rich | Big Swing Face | | Devin Townsend | Epicloud,Ziltoid the Omniscient,Casualties of Cool | | Iron Maiden | Somewhere in Time,Piece of Mind,Powerslave,Killers,No Prayer for the Dying | | Jim Reeves | Singing Down the Lane | | Michael Learns to Rock | Eternity,Scandinavia,Blue Night | | The Script | No Sound Without Silence | | Tom Jones | Long Lost Suitcase,Praise and Blame,Along Came Jones | +------------------------+----------------------------------------------------------------------------+
लंबाई से सावधान रहें!
GROUP_CONCAT()
. का उपयोग करते समय एक महत्वपूर्ण बात जो आपको जाननी चाहिए यह है कि परिणाम को group_concat_max_len
द्वारा प्रदान की गई अधिकतम लंबाई तक छोटा कर दिया गया है सिस्टम वैरिएबल, जिसका डिफ़ॉल्ट मान 1024
. है ।
निम्न सिंटैक्स का उपयोग करके इस वैरिएबल का मान अधिक सेट किया जा सकता है:
SET [GLOBAL | SESSION] group_concat_max_len = val;
जहां val
एक अहस्ताक्षरित पूर्णांक है।
हालांकि, ध्यान दें कि वापसी मूल्य की प्रभावी अधिकतम लंबाई स्वयं max_allowed_packet
के मान से सीमित होती है ।