MySQL और GROUP_CONCAT () अधिकतम लंबाई


260

मैं GROUP_CONCAT()कई पंक्तियों को एक स्ट्रिंग में बदलने के लिए एक MySQL क्वेरी में उपयोग कर रहा हूं । हालांकि, इस फ़ंक्शन के परिणाम की अधिकतम लंबाई 1024वर्ण है।

मैं अच्छी तरह से जानता हूं कि मैं group_concat_max_lenइस सीमा को बढ़ाने के लिए परम को बदल सकता हूं :

SET SESSION group_concat_max_len = 1000000;

हालाँकि, मैं जिस सर्वर का उपयोग कर रहा हूं, मैं किसी भी परम को नहीं बदल सकता। पूर्ववर्ती क्वेरी का उपयोग करके नहीं और किसी भी कॉन्फ़िगरेशन फ़ाइल को संपादित करके नहीं।

तो मेरा सवाल यह है कि क्या एक पंक्ति में कई पंक्ति क्वेरी का आउटपुट प्राप्त करने का कोई अन्य तरीका है?


1
आपका मतलब नौकरी क्लाइंट-साइड करने से है?
lexu

40
धन्यवाद मित्र ... आपका प्रश्न मेरे प्रश्न का उत्तर है :)
मंसूरखान चेरूपुझा

आपको पहले से ही एक उत्तर चुना हुआ लगता है, लेकिन जिज्ञासा से बाहर, आप SETसत्र चर को बदलने के लिए कथन का उपयोग क्यों नहीं कर सकते ?
बिल कार्विन

2
ऐसा इसलिए है क्योंकि मेरे द्वारा बनाई गई क्वेरी को कुछ सड़े हुए होममेड php फ्रेमवर्क में एम्बेड किया गया था, और मुझे किसी अन्य भाग को संपादित करने की अनुमति नहीं थी। जिस तरह से इस परियोजना को कोडित किया गया वह वास्तव में शर्मनाक था।
ZeWaren

1
मुझे आश्चर्य हुआ कि जब group_concat फ़ंक्शन का उपयोग करके मेरी स्ट्रिंग वापस आ गई थी, तो मुझे यह पता नहीं था कि इस फ़ंक्शन ने सीमित संख्या में चार धन्यवाद दोस्त को आपका प्रश्न मुझे स्पष्ट कर दिया :)
MasoodUrRehman

जवाबों:


335
SET SESSION group_concat_max_len = 1000000;

एक अस्थायी, सत्र-गुंजाइश, सेटिंग है। यह केवल वर्तमान सत्र पर लागू होता है आपको इसे इस तरह से उपयोग करना चाहिए।

SET SESSION group_concat_max_len = 1000000;
select group_concat(column) from table group by column

होस्टिंग साझा करने में भी आप ऐसा कर सकते हैं, लेकिन जब आप दूसरे सत्र का उपयोग करते हैं, तो आपको SET SESSIONकमांड दोहराने की आवश्यकता होती है ।


4
मैंने सत्र के बजाय GLOBAL का उपयोग करना पसंद किया: SET GLOBAL group_concat_max_len=6999सेटिंग को सभी प्रश्नों के लिए वैध बनाने के लिए
IcedDante

2
रैकस्पेस और अन्य क्लाउड सर्वर वैश्विक एक्सेस की अनुमति नहीं देते हैं। मैं jdbc.execute ("SET SIONION group_concat_max_len = ...") का उपयोग करने का प्रयास करता हूं; डाओ इनिशियलाइज़ मेथड के अंदर लेकिन जैसा कि कीटकैट ने कहा है, यह केवल अस्थायी है। अगर किसी को इस बदलाव को स्थायी रूप से करने का सही तरीका पता है pls मुझे बताएं
IcedDante

61

अधिकतम लंबाई निर्धारित करने के लिए सही पैरामीटर है:

SET @@group_concat_max_len = value_numeric;

value_numericहोना चाहिए> 1024; डिफ़ॉल्ट रूप से group_concat_max_lenमान 1024 है।


3
सेट सेशन और सेट ग्लोबल एक निश्चित सर्वर पर काम नहीं किया, लेकिन यह किया! धन्यवाद!
mfink

यह काम किया, जबकि अन्य सुझावों में MySQL Server 5.1.41 नहीं था (मुझे पता है कि यह एक पुराना संस्करण है)
low_rents 7

2
आप वास्तव group_concat_max_lenमें 4 से कम के रूप में सेट कर सकते हैं । ( mysql डॉक्स )। " value_numericहोना चाहिए> = 4" यहाँ मामला है। मैंने वास्तव में इसका उपयोग यह परीक्षण करने के लिए किया है कि जब आप group_concat_max_lenमूल्य से अधिक होते हैं तो क्या होता है ।
थॉमस एफ

1
मैं पुष्टि करते हैं कि इस पैरामीटर बिल्कुल है सकते हैं नहीं एक बार mysql पुन: प्रारंभ होने, संपत्ति 1024 resetted है, इसलिए -1 मेरे लिए: रिबूट प्रूफ
फ्रेडेरिक

2
@NoWay आपको mysql के पुनरारंभ पर लागू करने के लिए सेटिंग के लिए कॉन्फ़िगरेशन फ़ाइल (जैसे my.cnf) में मान सेट करना होगा। SETपुनरारंभ होने के बाद कोई भी क्वेरी सेटिंग्स को प्रभावित नहीं करेगी।
ब्यूटिक बटुक


8

आप यह कोशिश कर सकते हैं

SET GLOBAL group_concat_max_len = 1000000;

मैं चला रहा हूँ यह मेरे db के लिए sqlyog ग्राहक है, लेकिन यह प्रतिबिंबित नहीं कर रहा है। लेकिन यह काम करने लगता है जब मैं इसे अपने जावा प्रोग्राम के माध्यम से चलाता हूं
जेरी

5

सही सिंटैक्स mysql है> SET @@global.group_concat_max_len = integer;
यदि आपके पास सर्वर पर ऐसा करने के लिए विशेषाधिकार नहीं हैं, जहां आपका डेटाबेस रहता है, तो एक क्वेरी का उपयोग करें जैसे:
mySQL = "SET @@session.group_concat_max_len = 10000;"या एक अलग मान।
अगली पंक्ति:
SET objRS = objConn.Execute(mySQL)  आपके चर भिन्न हो सकते हैं।
तब
mySQL="SELECT GROUP_CONCAT(......);"आदि
मैं अंतिम संस्करण का उपयोग करता हूं क्योंकि मेरे पास विश्व स्तर पर डिफ़ॉल्ट मान को बदलने के लिए विशेषाधिकार नहीं हैं (cPanel का उपयोग करके)।
उम्मीद है की यह मदद करेगा।


2
CREATE TABLE some_table (
  field1 int(11) NOT NULL AUTO_INCREMENT,
  field2 varchar(10) NOT NULL,
  field3 varchar(10) NOT NULL,
  PRIMARY KEY (`field1`)
);

INSERT INTO `some_table` (field1, field2, field3) VALUES
(1, 'text one', 'foo'),
(2, 'text two', 'bar'),
(3, 'text three', 'data'),
(4, 'text four', 'magic');

यह क्वेरी थोड़ी अजीब है, लेकिन इसे वेरिएबल को इनिशियलाइज़ करने के लिए दूसरी क्वेरी की ज़रूरत नहीं है; और इसे अधिक जटिल क्वेरी में एम्बेड किया जा सकता है। यह सभी 'फ़ील्ड 2 को अर्धविराम द्वारा अलग कर देता है।

SELECT result
FROM   (SELECT @result := '',
               (SELECT result
                FROM   (SELECT @result := CONCAT_WS(';', @result, field2) AS result,
                               LENGTH(@result)                            AS blength
                        FROM   some_table
                        ORDER  BY blength DESC
                        LIMIT  1) AS sub1) AS result) AS sub2; 

1
यह एक शानदार उत्तर है, लेकिन यह सवाल पूरी तरह से खत्म नहीं करता है - यह है कि बहुत लंबा कॉनैट कैसे प्राप्त किया जाए, लेकिन समूहन के बारे में क्या? आपकी क्वेरी प्रति पंक्ति एक पंक्ति के बजाय केवल एक पंक्ति लौटाती है।
बेनुबर्ड

मुझे याद है कि मैं वही करने की कोशिश कर रहा था - पूरे परिणाम को एक स्ट्रिंग में सेट करना।
ज़ेरवेन

9
@Benubird यह एक बहुत ही खराब क्वेरी है। और बुरे से मेरा मतलब भयानक है। ओपी एक सहसंबद्ध उपश्रेणी कर रहा है जिसमें एक उपश्रेणी है जो एक उपश्रेणी के अंदर है। यदि आप यह जांच कर रहे थे कि डेटा तुलना द्वारा आप उसके नमूने डेटा पर उर्फ ​​4 पंक्तियों की तुलना में 256 तुलनाएँ करेंगे .. अब कल्पना करें कि क्या आपके पास 1k पंक्तियाँ 1 ट्रिलियन तुलनाएँ हैं।
बजे जॉन रूडेल

@ जॉनरुडेल हाँ, यह है। मैं आपको आश्वस्त कर सकता हूं कि यह क्वेरी एक गंभीर लाइव सिस्टम के अंदर कहीं नहीं है। उस समय, मुझे किसी प्रकार की चुनौती / अभ्यास के लिए इसकी आवश्यकता थी।
13

5
आह गच्चा .. मैं आपको अन्य राहगीरों के लिए इसका एक नोट बनाने की सलाह दूंगा ... जैसा कि यह उत्तर भ्रामक होगा :) दिलचस्प प्रयास हालांकि
जॉन रुडेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.