মাইএসকিউএলে একটি কনক্যাটে GROUP_CONCAT কীভাবে ব্যবহার করবেন


117

মাইএসকিউএলে নিম্নলিখিত ডেটা সহ আমার যদি একটি টেবিল থাকে:

id       Name       Value
1          A          4
1          A          5
1          B          8
2          C          9

আমি কীভাবে এটি নীচের বিন্যাসে পেতে পারি?

id         Column
1          A:4,5,B:8
2          C:9


আমার মনে হয় আমাকে ব্যবহার করতে হবে GROUP_CONCAT। তবে আমি নিশ্চিত না যে এটি কীভাবে কাজ করে।

উত্তর:


160
select id, group_concat(`Name` separator ',') as `ColumnName`
from
(
  select 
    id, 
    concat(`Name`, ':', group_concat(`Value` separator ',')) as `Name`
  from mytbl
  group by 
    id, 
    `Name`
) tbl
group by id;

আপনি এটি এখানে বাস্তবায়িত দেখতে পাচ্ছেন: স্কেল ফিডল ডেমো । ঠিক আপনার যা প্রয়োজন

দুটি ধাপে স্প্লিটিং আপডেট করুন । প্রথমে আমরা একটি অনন্য [নাম, আইডি] এর বিপরীতে সমস্ত মান (কমা দ্বারা পৃথক) থাকা একটি টেবিল পাই। তারপর প্রাপ্ত টেবিল থেকে আমরা দেখতে সকল নামের এবং প্রতিটি অদ্বিতীয় আইডি প্রতি একটিমাত্র মান হিসাবে মান পেতে এই এখানে ব্যাখ্যা এসকিউএল বেহালার ডেমো (যেমন দুই ফলাফলের সেট আছে নীচে স্ক্রোল করুন)

সম্পাদনা প্রশ্নে ভুল ছিল, আমি কেবল আইডি দিয়ে গ্রুপ করেছি। তবে দুটি গ্রুপ_ যোগাযোগের প্রয়োজন যদি (মানগুলি নাম এবং আইডি দিয়ে গোষ্ঠীযুক্ত করতে হয় এবং তারপরে সমস্ত আইডির মাধ্যমে)। আগের উত্তর ছিল

select 
id,group_concat(concat(`name`,':',`value`) separator ',')
as Result from mytbl group by id

আপনি এটি এখানে প্রয়োগ করা দেখতে পারেন: এসকিউএল ফিডাল ডেমো


এটি বিশ্ব যা চেয়েছিল তা দেয় না।
eisberg

3
আমি জনগণকে সতর্ক করা এটির গুরুত্বপূর্ণ বলে মনে করি যে কেবল এক ধরণের বিভাজক ব্যবহার করা অসুবিধে হতে পারে। আমি "নাম" বিভাজকটিকে সেমিকোলন (;) হিসাবে তৈরি করার পরামর্শ দিচ্ছি, এবং মানগুলি পৃথককারী কমা হিসাবে থাকতে পারে (,)
ফান্দি সুসেন্টো

4
দয়া করে নোট করুন যে GROUP_CONCATনীরবে এটির আউটপুট কেটে যাবে group_concat_max_lenSET group_concat_max_len=...সাহায্য করবে, তবে ফিরে (বাইট?) দৈর্ঘ্যের চেয়ে কম কিনা তা যাচাই করে নেওয়া ভাল ধারণা group_concat_max_len
tuomassalo

2
আরও মনে রাখবেন যে গ্রুপ_কনক্যাট একটি একক নূন্যমূল্যের সাথে মুখোমুখি হয় এটি এতে থাকা পুরো সারিটি বাদ দিতে পারে। আমি এখানে দ্বিতীয় ক্যাভেটে এটিকে ঘিরে কাজ করি ।
ম্যাট্রিক্সম্যানএটিআইআরসেবা

1
যদি যে কেউ এসকিউএল ফিডল লিঙ্কটি দিয়ে সমস্যার সাথে জবাব দেয় তবে উত্তর দেওয়া হয়েছে। ওয়ার্কিং ফিডল এখানে রয়েছে: sqlfiddle.com/#!9/42f994/601/0
হিতেশ

21

চেষ্টা করুন:

CREATE TABLE test (
  ID INTEGER,
  NAME VARCHAR (50),
  VALUE INTEGER
);

INSERT INTO test VALUES (1, 'A', 4);
INSERT INTO test VALUES (1, 'A', 5);
INSERT INTO test VALUES (1, 'B', 8);
INSERT INTO test VALUES (2, 'C', 9);

SELECT ID, GROUP_CONCAT(NAME ORDER BY NAME ASC SEPARATOR ',')
FROM (
  SELECT ID, CONCAT(NAME, ':', GROUP_CONCAT(VALUE ORDER BY VALUE ASC SEPARATOR ',')) AS NAME
  FROM test
  GROUP BY ID, NAME
) AS A
GROUP BY ID;

এসকিউএল ফিডল: http://sqlfiddle.com/#!2/b5abe/9/0


2
হ্যাঁ আইসবার্গ +1। আপনার উত্তরটি বেশ নিখুঁত এবং পূর্ববর্তী। আমি আমার প্রথমবারের উত্তরে একটি ভুল করেছি
সামি

9
SELECT ID, GROUP_CONCAT(CONCAT_WS(':', NAME, VALUE) SEPARATOR ',') AS Result 
FROM test GROUP BY ID

7
আপনার উত্তরে কিছু বিবরণ যোগ করতে পারলে ভাল লাগবে। এটি এবং ভবিষ্যতের উত্তরগুলির উন্নতি করার জন্য এটি একটি পরামর্শ। ধন্যবাদ!
লুস ক্রুজ

5

প্রথমত, আমি কোনও আইডি রাখার কারণটি দেখতে পাচ্ছি না যা অনন্য নয়, তবে আমার ধারণা এটি কোনও আইডি যা অন্য টেবিলের সাথে সংযুক্ত। দ্বিতীয়টি সাবকিউয়ের দরকার নেই, যা সার্ভারকে মারধর করে। আপনি এই মত একটি ক্যোয়ারিতে এটি করুন

SELECT id,GROUP_CONCAT(name, ':', value SEPARATOR "|") FROM sample GROUP BY id

আপনি দ্রুত এবং সঠিক ফলাফল পেয়েছেন এবং ফলাফলটি "SE" এর দ্বারা বিভক্ত করতে পারেন | আমি সর্বদা এই বিভাজকটি ব্যবহার করি, কারণ এটি স্ট্রিংয়ের মধ্যে এটি খুঁজে পাওয়া অসম্ভব, কারণ এটি অনন্য। দুটি এ এর ​​কোনও সমস্যা নেই, আপনি কেবল মানটি শনাক্ত করুন। অথবা আপনি চিঠিটি সহ আরও একটি কলম রাখতে পারেন যা আরও ভাল। এটার মত :

SELECT id,GROUP_CONCAT(DISTINCT(name)), GROUP_CONCAT(value SEPARATOR "|") FROM sample GROUP BY name

2
 SELECT id, GROUP_CONCAT(CONCAT_WS(':', Name, CAST(Value AS CHAR(7))) SEPARATOR ',') AS result 
    FROM test GROUP BY id

আপনাকে অবশ্যই castালাই বা রূপান্তর করতে হবে, অন্যথায় বিএলএব ফিরে আসবে

ফলাফল হয়

id         Column
1          A:4,A:5,B:8
2          C:9

অজগর বা জাভা এর মতো প্রোগ্রামের মাধ্যমে আপনাকে পুনরায় ফলাফলটি পরিচালনা করতে হবে


0

IF OBJECT_ID('master..test') is not null Drop table test

CREATE TABLE test (ID INTEGER, NAME VARCHAR (50), VALUE INTEGER );
INSERT INTO test VALUES (1, 'A', 4);
INSERT INTO test VALUES (1, 'A', 5);
INSERT INTO test VALUES (1, 'B', 8);
INSERT INTO test VALUES (2, 'C', 9);

select distinct NAME , LIST = Replace(Replace(Stuff((select ',', +Value from test where name = _a.name for xml path('')), 1,1,''),'<Value>', ''),'</Value>','') from test _a order by 1 desc

আমার সারণির নাম পরীক্ষা করা হয়, এবং একত্রীকরণের জন্য আমি এক্সএমএল পাথ ('') সিনট্যাক্স ব্যবহার করি। স্টাফ ফাংশন স্ট্রিংটিকে অন্য স্ট্রিংয়ের মধ্যে serোকায়। এটি স্টার্ট পজিশনে প্রথম স্ট্রিংয়ে বর্ণের একটি নির্দিষ্ট দৈর্ঘ্য মুছে ফেলে এবং তারপরে দ্বিতীয় স্ট্রিংটি প্রথম স্ট্রিংয়ের প্রারম্ভিক অবস্থানে সন্নিবেশ করায়।

STUFF ফাংশনগুলি দেখতে এর মতো দেখাচ্ছে: STUFF (অক্ষর_প্রকাশ, শুরু, দৈর্ঘ্য, অক্ষর_প্রকাশ)

ক্যারেক্টার_এক্সপ্রেসন হ'ল অক্ষর ডেটার একটি অভিব্যক্তি। অক্ষর_প্রকাশটি অক্ষর বা বাইনারি ডেটার একটি ধ্রুবক, পরিবর্তনশীল, বা কলাম হতে পারে।

শুরু হ'ল একটি পূর্ণসংখ্যা মান যা মুছা এবং সন্নিবেশ শুরু করার জন্য অবস্থান নির্দিষ্ট করে। শুরু বা দৈর্ঘ্য যদি নেতিবাচক হয় তবে একটি নাল স্ট্রিং ফিরে আসে। শুরুটি যদি প্রথম অক্ষর_প্রকাশের চেয়ে দীর্ঘ হয় তবে একটি নাল স্ট্রিং ফিরে আসে। শুরু টাইপ বিগিন্ট হতে পারে।

দৈর্ঘ্য হল একটি পূর্ণসংখ্যা যা মুছতে অক্ষরের সংখ্যা নির্দিষ্ট করে। দৈর্ঘ্য যদি প্রথম অক্ষর_প্রকাশের চেয়ে দীর্ঘ হয় তবে মুছে ফেলা শেষ অক্ষর_প্রকাশের সর্বশেষ অক্ষর পর্যন্ত ঘটে। দৈর্ঘ্য টাইপ বিগিন্ট হতে পারে।


0

আইডি নির্বাচন করুন, গ্রুপ_কনক্যাট ( column) ফ্রম ( নির্বাচন করুন আইডি, কনক্যাট ( name, ':', গ্রুপ_কনক্যাট ( value)) হিসাবে column মাইটিবিএল গ্রুপের আইডি, নাম) টিবিএল গ্রুপের আইডি দ্বারা গ্রাহক;

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.