মাইএসকিউএল এবং GROUP_CONCAT () সর্বাধিক দৈর্ঘ্য


260

আমি GROUP_CONCAT()একাধিক সারিকে একটি স্ট্রিংয়ে রূপান্তর করতে একটি মাইএসকিউএল কোয়েরি ব্যবহার করছি । তবে এই ফাংশনের ফলাফলের সর্বোচ্চ দৈর্ঘ্য হ'ল 1024অক্ষর।

আমি খুব ভালভাবে অবগত যে group_concat_max_lenএই সীমাটি বাড়ানোর জন্য আমি পরম পরিবর্তন করতে পারি :

SET SESSION group_concat_max_len = 1000000;

তবে, আমি যে সার্ভারটি ব্যবহার করছি সেটিতে আমি কোনও প্যারাম পরিবর্তন করতে পারি না। পূর্ববর্তী কোয়েরি ব্যবহার করে নয় এবং কোনও কনফিগারেশন ফাইল সম্পাদনা করে নয়।

সুতরাং আমার প্রশ্নটি হল: একাধিক সারি ক্যোয়ারির আউটপুটকে একক স্ট্রিংয়ে আনার অন্য কোনও উপায় আছে কি?


1
আপনি কাজের ক্লায়েন্ট-সাইড ছাড়া অন্য মানে?
লেেক্সু

40
ধন্যবাদ বন্ধু ... আপনার প্রশ্নটি আমার প্রশ্নের জবাব :)
মনসুরখান চেরুপুজা

আপনি ইতিমধ্যে একটি উত্তর বেছে নিয়েছেন বলে মনে হয়, কিন্তু কৌতূহলের বাইরে, আপনি কেন SETসেশন ভেরিয়েবল পরিবর্তন করতে স্টেটমেন্টটি ব্যবহার করতে পারবেন না ?
বিল কারভিন

2
এটি কারণ যে আমার তৈরি করা ক্যোয়ারীটি কিছু পচা হোমমেড পিএইচপি ফ্রেমওয়ার্কে এম্বেড করা হয়েছিল এবং আমাকে অন্য কোনও অংশ সম্পাদনা করার অনুমতি দেওয়া হয়নি। এই প্রকল্পটি যেভাবে কোড করা হয়েছিল তা সত্যিই লজ্জাজনক ছিল।
ZeWaren

1
আমি যখন অবাক হয়ে গেলাম_গ্রুপ_ক্যাঙ্ক্ট ফাংশনটি ব্যবহার করার পরে আমার স্ট্রিংটি রিটার্ন ব্রেক ছিল, আমার এই ধারণাটি ছিল না যে এই ফাংশনটি সীমিত সংখ্যক চর ফিরবে ধন্যবাদ বন্ধু আপনার প্রশ্নটি আমাকে পরিষ্কার করে দিয়েছে :)
মাসউদউরহিমন

উত্তর:


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
আমি সেশনের পরিবর্তে গ্লোবাল ব্যবহার করতে পছন্দ করেছি: এ SET GLOBAL group_concat_max_len=6999প্রশ্নের সেটিংসকে বৈধ করার জন্য
আইসডড্যান্ট

2
র‌্যাকস্পেস এবং অন্যান্য ক্লাউড সার্ভারগুলি গ্লোবাল অ্যাক্সেসের অনুমতি দেয় না। আমি jdbc.execute ("SET SESSION group_concat_max_len = ...") ব্যবহার করার চেষ্টা করছি; দাও সূচনা পদ্ধতির অভ্যন্তরে তবে কেটকেট যেমন বলেছে, এটি কেবল সাময়িক is এই পরিবর্তনটি স্থায়ীভাবে করার সঠিক উপায় যদি কেউ জানেন তবে দয়া করে আমাকে জানান
আইসডড্যান্ট

61

সর্বোচ্চ দৈর্ঘ্য নির্ধারণের জন্য সঠিক পরামিতিটি হ'ল:

SET @@group_concat_max_len = value_numeric;

value_numericঅবশ্যই> 1024; ডিফল্টরূপে group_concat_max_lenমান 1024।


3
সেট সেশন এবং সেট সেট গ্লোবাল কোনও নির্দিষ্ট সার্ভারে কাজ করেনি, তবে এটি হয়েছে! ধন্যবাদ!
এমফিংক

অন্যান্য পরামর্শ @ মাইএসকিউএল সার্ভার 5.1.41 (আমি জানি এটি একটি পুরানো সংস্করণ নয়) কাজ করেছিল
কম

2
আপনি আসলে group_concat_max_lenনিচে 4 হিসাবে সেট করতে পারেন । ( মাইএসকিএল ডক্স ) " value_numericঅবশ্যই> = 4" এখানে রয়েছে। আপনি যখন group_concat_max_lenমানটি ছাড়িয়ে যান তখন কী হয় তা পরীক্ষার জন্য আমি এটি ব্যবহার করেছি ।
থমাস এফ

1
আমি নিশ্চিত করছি যে এই প্যারামিটারটি একেবারে হয় পারেন না একবার মাইএসকিউএল পুনরায় আরম্ভ করা হয়, সম্পত্তি 1024 থেকে resetted হয়, তাই -1 আমার জন্য: রিবুট রোধক
ফ্রেডেরিক

2
@ না ওয়ে, আপনাকে মাইএসকিএল পুনরায় চালু করার জন্য সেটিংয়ের জন্য কনফিগারেশন ফাইলের (যেমন মাই সিএনএফ) মান নির্ধারণ করতে হবে। SETপুনরায় আরম্ভের পরে কোনও ক্যোয়ারী সেটিংসকে প্রভাবিত করবে না ।
বাটাল বাটকাস


8

আপনি এটি চেষ্টা করতে পারেন

SET GLOBAL group_concat_max_len = 1000000;

আমি এটি চালাচ্ছি আমার ডিবি এর জন্য স্ক্লায়োগ ক্লায়েন্ট, তবে এটি প্রতিফলিত হচ্ছে না। তবে এটি আমার জাভা প্রোগ্রামের মাধ্যমে চালানোর সময় মনে হচ্ছে এটি কার্যকর হবে
জেরি

5

সঠিক বাক্য গঠনটি মাইএসকিএল> SET @@global.group_concat_max_len = integer;
আপনার ডাটাবেসটি যেখানে রয়েছে সেই সার্ভারে যদি এটি করার অধিকার না পান তবে একটি কোয়েরি যেমন:
মাইএসকিউএল = "SET @@session.group_concat_max_len = 10000;"বা অন্য কোনও মান ব্যবহার করুন।
পরবর্তী লাইন:
SET objRS = objConn.Execute(mySQL)  আপনার ভেরিয়েবলগুলি পৃথক হতে পারে।
তারপর
mySQL="SELECT GROUP_CONCAT(......);"ইত্যাদি
আমি গত সংস্করণ ব্যবহার যেহেতু আমি বিশ্বব্যাপী 1024 ডিফল্ট মান পরিবর্তন করতে (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
এটি দুর্দান্ত উত্তর, তবে পুরোপুরি প্রশ্নটি শেষ করে না - এইভাবে একটি দীর্ঘ দীর্ঘ কনক্যাট কীভাবে পাওয়া যায়, তবে গ্রুপিংয়ের কী হবে? আপনার ক্যোয়ারী প্রতি গ্রুপে এক সারির পরিবর্তে কেবল একটি সারি দেয়।
বেনুবার্ড

আমার মনে আছে আমি সেটাই করতে চেষ্টা করছিলাম - পুরো ফলাফলটি একক স্ট্রিংয়ে সেট করে।
ZeWaren

9
@ বেনুবার্ড এটি খুব খারাপ প্রশ্ন query এবং খারাপভাবে আমি ভয়ানক মানে। ওপিতে একটি সহযোগী সাবকোয়ারি করছে যা একটি সাবকোয়ারির ভিতরে সাবকিউরি রয়েছে। আপনি যদি তথ্যের তুলনা করে পরীক্ষা করে দেখেন যে তার স্যাম্পল ডেটা ওফ 4 সারি সেট করে 256 টি তুলনা করতে হবে .. এখন ভাবুন আপনার যদি 1 কে সারি 1 ট্রিলিয়ন তুলনা হয়।
জন রুডেল

@ জনরডডেল হ্যাঁ, এটি। আমি আপনাকে নিশ্চিত করতে পারি যে এই কোয়েরিটি কোনও গুরুতর লাইভ সিস্টেমের অভ্যন্তরে নেই। একসময় আমার চ্যালেঞ্জ / অনুশীলনের জন্য এটির দরকার ছিল।
ZeWaren

5
আহ গোচাচা .. আমি আপনাকে অন্য যাত্রীদের জন্য এটির একটি নোট দেওয়ার পরামর্শ দিচ্ছি ... যেহেতু এই উত্তরটি বিভ্রান্তিকর হবে :) যদিও আকর্ষণীয় প্রচেষ্টা
জন রুডেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.