MySQL में एक GROUP_CONCAT()
है फ़ंक्शन जो हमें एक क्वेरी से एक सीमांकित सूची के रूप में कॉलम वापस करने में सक्षम बनाता है।
यह संयोजित गैर-NULL
. के साथ एक स्ट्रिंग परिणाम देता है एक समूह से मूल्य।
सिंटैक्स
वाक्य रचना इस प्रकार है:
GROUP_CONCAT([DISTINCT] expr [,expr ...]
[ORDER BY {unsigned_integer | col_name | expr}
[ASC | DESC] [,col_name ...]]
[SEPARATOR str_val])
उदाहरण
मान लीजिए कि हम निम्नलिखित क्वेरी चलाते हैं:
SELECT PetName
FROM Pets;
और हमें निम्नलिखित परिणाम मिलते हैं:
+---------+ | PetName | +---------+ | Fluffy | | Fetch | | Scratch | | Wag | | Tweet | | Fluffy | | Bark | | Meow | +---------+ 8 rows in set (0.00 sec)
हम उपयोग कर सकते हैं GROUP_CONCAT()
उन सभी पंक्तियों को एक सीमित सूची के रूप में वापस करने के लिए।
ऐसा करने के लिए, हमें PetName
. पास करना होगा GROUP_CONCAT()
. के तर्क के रूप में कॉलम समारोह:
SELECT GROUP_CONCAT(PetName)
FROM Pets;
परिणाम:
+-------------------------------------------------+ | GROUP_CONCAT(PetName) | +-------------------------------------------------+ | Fluffy,Fetch,Scratch,Wag,Tweet,Fluffy,Bark,Meow | +-------------------------------------------------+ 1 row in set (0.01 sec)
आदेश देना
हम ORDER BY
. का उपयोग कर सकते हैं इस फ़ंक्शन के आउटपुट को ऑर्डर करने के लिए क्लॉज:
SELECT GROUP_CONCAT(PetName ORDER BY PetName ASC)
FROM Pets;
परिणाम:
Bark,Fetch,Fluffy,Fluffy,Meow,Scratch,Tweet,Wag
ध्यान दें कि यह केवल GROUP_CONCAT()
. के आउटपुट को सॉर्ट करता है फ़ंक्शन - यह SELECT
. पर लागू किसी भी आदेश से पूरी तरह से स्वतंत्र है बयान ही।
DISTINCT
खंड
हम DISTINCT
. का उपयोग कर सकते हैं अद्वितीय मान वापस करने के लिए खंड। दूसरे शब्दों में, यदि डुप्लिकेट मान हैं, तो केवल एक घटना वापस आती है:
SELECT GROUP_CONCAT(DISTINCT PetName ORDER BY PetName ASC)
FROM Pets;
परिणाम:
Bark,Fetch,Fluffy,Meow,Scratch,Tweet,Wag
इस मामले में, Fluffy
केवल एक बार प्रकट होता है। जब हम इसे DISTINCT
. के बिना चलाते हैं खंड, Fluffy
दो बार प्रकट होता है।
विभाजक को बदलना
डिफ़ॉल्ट रूप से, सूची अल्पविराम का उपयोग सीमांकक के रूप में करती है। लेकिन अगर हम चाहें तो इसे बदल सकते हैं:
SELECT GROUP_CONCAT(PetName SEPARATOR '-')
FROM Pets;
परिणाम:
Fluffy-Fetch-Scratch-Wag-Tweet-Fluffy-Bark-Meow
हम सभी विभाजकों को हटाने के लिए एक खाली स्ट्रिंग का भी उपयोग कर सकते हैं (ताकि मानों को जोड़ा जा सके):
SELECT GROUP_CONCAT(PetName SEPARATOR '')
FROM Pets;
और हमें निम्नलिखित परिणाम मिलते हैं:
FluffyFetchScratchWagTweetFluffyBarkMeow
समूहीकृत क्वेरी परिणाम
हम GROUP_CONCAT()
. शामिल कर सकते हैं GROUP BY
. के साथ एक क्वेरी में इस तरह का परिणाम प्राप्त करने के लिए क्लॉज:
SELECT
PetTypeId,
GROUP_CONCAT(PetName ORDER BY PetName ASC)
FROM Pets
GROUP BY PetTypeId
ORDER BY PetTypeId;
परिणाम:
+-----------+--------------------------------------------+ | PetTypeId | GROUP_CONCAT(PetName ORDER BY PetName ASC) | +-----------+--------------------------------------------+ | 1 | Tweet | | 2 | Fluffy,Meow,Scratch | | 3 | Bark,Fetch,Fluffy,Wag | +-----------+--------------------------------------------+
मेरे डेटाबेस में, वास्तविक पालतू प्रकार के नाम PetTypes
. नामक एक अन्य तालिका में हैं . इसलिए हम एक INNER JOIN
चला सकते हैं PetTypes
पर वास्तविक पालतू प्रकार के नाम प्राप्त करने के लिए तालिका:
SELECT
pt.PetType,
GROUP_CONCAT(p.PetName ORDER BY p.PetName ASC)
FROM Pets p
INNER JOIN PetTypes pt ON
p.PetTypeId = pt.PetTypeId
GROUP BY pt.PetType
ORDER BY pt.PetType ASC;
परिणाम:
+---------+------------------------------------------------+ | PetType | GROUP_CONCAT(p.PetName ORDER BY p.PetName ASC) | +---------+------------------------------------------------+ | Bird | Tweet | | Cat | Fluffy,Meow,Scratch | | Dog | Bark,Fetch,Fluffy,Wag | +---------+------------------------------------------------+
लंबाई की सीमाएं
GROUP_CONCAT()
के आउटपुट को group_concat_max_len
द्वारा दी गई अधिकतम लंबाई तक छोटा कर दिया गया है सिस्टम वैरिएबल, जिसका डिफ़ॉल्ट मान 1024
. है . मान अधिक सेट किया जा सकता है, हालांकि वापसी मान की प्रभावी अधिकतम लंबाई max_allowed_packet
के मान से सीमित है ।
आप इस तरह वर्तमान मूल्य की जांच कर सकते हैं:
SHOW VARIABLES LIKE '%group_concat%';
इस मान को बदलने का सिंटैक्स इस प्रकार है:
SET [GLOBAL | SESSION] group_concat_max_len = val;
जहां val
एक अहस्ताक्षरित पूर्णांक है।