আমি কি এক ক্ষেত্রে একাধিক মাইএসকিউএল সারি একত্রিত করতে পারি?


1213

ব্যবহার করে MySQL, আমি এর মতো কিছু করতে পারি:

SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;

আমার আউটপুট:

shopping
fishing
coding

তবে পরিবর্তে আমি কেবল 1 সারি, 1 কর্ন চাই:

প্রত্যাশিত আউটপুট:

shopping, fishing, coding

কারণটি হ'ল আমি একাধিক সারণীগুলি থেকে একাধিক মান নির্বাচন করছি এবং সমস্ত যোগদানের পরে আমি যা চাই তার চেয়ে অনেক বেশি সারি পেয়েছি।

আমি মাইএসকিউএল ডকটিতে একটি ফাংশন সন্ধান করেছি এবং এটির ফলাফলগুলি CONCATবা CONCAT_WSফাংশনগুলি গ্রহণ করার মতো মনে হচ্ছে না ।

সুতরাং এখানে কেউ কীভাবে এটি করতে জানেন?


উত্তর:


1737

আপনি ব্যবহার করতে পারেন GROUP_CONCAT:

SELECT person_id, GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;

লুডভিগ যেমন নিজের মন্তব্যে বলেছেন ,DISTINCT নকলগুলি এড়ানোর জন্য আপনি অপারেটরটি যুক্ত করতে পারেন :

SELECT person_id, GROUP_CONCAT(DISTINCT hobbies SEPARATOR ', ')
FROM peoples_hobbies 
GROUP BY person_id;

জান যেমন তাদের মন্তব্যে বলেছিল , আপনি এটি ব্যবহার করে মানগুলি সাজানোর আগে বাছাই করতে পারেন ORDER BY:

SELECT person_id, GROUP_CONCAT(hobbies ORDER BY hobbies ASC SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;

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

SET group_concat_max_len = 2048;

অবশ্যই, আপনি 2048আপনার প্রয়োজন অনুযায়ী পরিবর্তন করতে পারেন । মান গণনা এবং নির্ধারণ করতে:

SET group_concat_max_len = CAST(
    (SELECT SUM(LENGTH(hobbies)) + COUNT(*) * LENGTH(', ')
    FROM peoples_hobbies 
    GROUP BY person_id)
    AS UNSIGNED
);

154
ফলাফল কলামে 1024 বাইটের সীমাবদ্ধতা সম্পর্কে কেবল সচেতন হন (প্যারামিটার গ্রুপ_ক্যাঙ্ক_ম্যাক্স_লেন দেখুন )
ডাগ

81
এবং DISTINCTপ্যারামিটার যুক্ত করে , আপনি কোনও ডাবল পাবেন না। ... GROUP_CONCAT(DISTINCT hobbies)
লুডভিগ

3
আমার প্রয়োজনটি ছিল একটি কলাম থেকে সমস্ত ডেটা পাওয়া। এটি করার জন্য গ্রুপ দ্বারা গ্রুপ ব্যবহার করবেন না। উদাহরণ: নির্বাচন করুন GROUP_CONCAT (ইমেলগুলি SEPARATOR ',') থেকে ব্যবহারকারীগণ;
জোনাথন বার্গারন

1
ধন্যবাদ, আমি জানতাম না এখানে গ্রুপ কনক্যাট দৈর্ঘ্যের সীমা ছিল। আমার তৈরি একটি দৈত্যের তালিকা পেতে আমার এটির দরকার ছিল।
প্যাট্রিক

9
আপনি যদি ফলাফলটি ছড়িয়ে পড়া স্ট্রিং ব্যবহারের শখগুলি বাছাই করতে চান:SELECT person_id, GROUP_CONCAT(hobbies ORDER BY hobbies ASC SEPARATOR ', ') FROM peoples_hobbies GROUP BY person_id
জানুয়ারী

106

কটাক্ষপাত আছে GROUP_CONCATআপনার মাইএসকিউএল সংস্করণ (4.1) এটিকে সমর্থন করে। আরও বিশদ জন্য ডকুমেন্টেশন দেখুন ।

এটি দেখতে কিছু হবে:

  SELECT GROUP_CONCAT(hobbies SEPARATOR ', ') 
  FROM peoples_hobbies 
  WHERE person_id = 5 
  GROUP BY 'all';

11
আমি মনে করি এটি group by 'all'প্রয়োজনীয় নয় (আরও অযাচিত), কারণ এটি সমস্ত সারিগুলির স্ট্রিংকে নির্ধারিত করে allএবং তারপরে এই সারিগুলির মধ্যে স্ট্রিংগুলির তুলনা করে। আমি কি সঠিক?
ক্রিজিসিক

74

একাধিক, স্বতন্ত্র সারিগুলিকে যুক্ত করতে বিকল্প বাক্য গঠন

সতর্কতা: এই পোস্টটি আপনাকে ক্ষুধার্ত করে তুলবে।

প্রদত্ত:

আমি নিজেকে একাধিক, পৃথক সারি - একটি গ্রুপের স্থিতি - এবং একটি নির্দিষ্ট ক্ষেত্রে সম্মিলিত করতে চাইছিলাম।

ধরা যাক আপনার কাছে পণ্য আইডির একটি টেবিল রয়েছে এবং তাদের নাম এবং দাম রয়েছে:

+------------+--------------------+-------+
| product_id | name               | price |
+------------+--------------------+-------+
|         13 | Double Double      |     5 |
|         14 | Neapolitan Shake   |     2 |
|         15 | Animal Style Fries |     3 |
|         16 | Root Beer          |     2 |
|         17 | Lame T-Shirt       |    15 |
+------------+--------------------+-------+

তারপরে আপনার কাছে কিছু অভিনব-স্ক্যান্সিজি এজাক্স রয়েছে যা এই কুকুরছানাগুলিকে চেকবক্স হিসাবে তালিকাভুক্ত করে।

আপনার ক্ষুধার্ত-হিপ্পো ব্যবহারকারী নির্বাচন করে 13, 15, 16। আজ তার জন্য কোনও মিষ্টি নেই ...

অনুসন্ধান:

খাঁটি মাইএসকিএল সহ আপনার ব্যবহারকারীর ক্রমকে এক লাইনে সংক্ষিপ্ত করার উপায়।

সমাধান:

ব্যবহার করুন GROUP_CONCATসঙ্গে দফা :IN

mysql> SELECT GROUP_CONCAT(name SEPARATOR ' + ') AS order_summary FROM product WHERE product_id IN (13, 15, 16);

কোন ফলাফল:

+------------------------------------------------+
| order_summary                                  |
+------------------------------------------------+
| Double Double + Animal Style Fries + Root Beer |
+------------------------------------------------+

বোনাস সমাধান:

আপনি যদি মোট দামও চান, তবে টস করুন SUM():

mysql> SELECT GROUP_CONCAT(name SEPARATOR ' + ') AS order_summary, SUM(price) AS total FROM product WHERE product_id IN (13, 15, 16);
+------------------------------------------------+-------+
| order_summary                                  | total |
+------------------------------------------------+-------+
| Double Double + Animal Style Fries + Root Beer |    10 |
+------------------------------------------------+-------+

পিএস: আপনার নিকটস্থ কোনও এন-আউট না থাকলে ক্ষমা চাই ...


11
যদিও এটি একটি ভাল উত্তর, খাঁটি উত্তর দেওয়ার চেয়ে এটিকে বিজ্ঞাপনের মতো মনে হয়। এখনও একটি ভাল সুসংহত উত্তর।
ফ্লাইফি

1
আমি সাহায্য পেতে পারেন stackoverflow.com/q/60278898/11697039 @elbowlobstercowstand
zus



25

আমার ক্ষেত্রে আমার আইডির একটি সারি ছিল এবং এটি চরে ফেলে দেওয়া প্রয়োজনীয় ছিল, অন্যথায়, ফলাফলটি বাইনারি বিন্যাসে এনকোড করা হয়েছিল:

SELECT CAST(GROUP_CONCAT(field SEPARATOR ',') AS CHAR) FROM table

1
ধন্যবাদ! ফলাফল না হলে CASTআমি মানগুলি পছন্দ করতাম [BLOB - 14 Bytes]!
মেল_২

1
আমি সাহায্য পেতে পারেন stackoverflow.com/q/60278898/11697039 @Fedir RYKHTIK
zus

16

নিম্নলিখিতগুলির মতো মাইএসকিউএল (5.6.13) সেশন ভেরিয়েবল এবং অ্যাসাইনমেন্ট অপারেটর ব্যবহার করুন

SELECT @logmsg := CONCAT_ws(',',@logmsg,items) FROM temp_SplitFields a;

তাহলে আপনি পেতে পারেন

test1,test11

2
এটি কি GROUP_CONCAT এর চেয়ে দ্রুত?
jave.web

1
আমি পিএইচপিএমওয়াই অ্যাডমিনের অধীনে মাইএসকিউএল সার্ভার v5.6.17 এর সাথে পরীক্ষার টেবিলে বর্ণিত কলামে ( বারচর (50)) এটি পরীক্ষা করেছি তবে এটি প্রতিটি রেকর্ডের জন্য একটি বিএলএলবি ফিল্ড প্রত্যাবর্তন করে:SELECT @logmsg := CONCAT_ws(',',@logmsg,description) from test
জানুয়ারী

14

আমার আরও জটিল জিজ্ঞাসা ছিল এবং আমি দেখতে পেয়েছি যে এটি কাজ করতে আমাকে GROUP_CONCATএকটি বহিরাগত ক্যোয়ারিতে ব্যবহার করতে হয়েছিল:

মূল প্রশ্ন:

SELECT DISTINCT userID 
FROM event GROUP BY userID 
HAVING count(distinct(cohort))=2);

imploded:

SELECT GROUP_CONCAT(sub.userID SEPARATOR ', ') 
FROM (SELECT DISTINCT userID FROM event 
GROUP BY userID HAVING count(distinct(cohort))=2) as sub;

আশা করি এটি কারও সাহায্য করবে।


9

কারও জন্য এখানে GROUP_CONCATসাবকিয়ারির সাথে কীভাবে ব্যবহার করা যায় তা দেখার জন্য - এই উদাহরণটি পোস্ট করে

SELECT i.*,
(SELECT GROUP_CONCAT(userid) FROM favourites f WHERE f.itemid = i.id) AS idlist
FROM items i
WHERE i.id = $someid

সুতরাং GROUP_CONCATsubquery এর ভিতরে অবশ্যই ব্যবহার করা উচিত, এটি মোড়ানো নয়।


1
এটি ঠিক আমি যা খুঁজছিলাম তা ছিল
বুমেং

7

এটা চেষ্টা কর:

DECLARE @Hobbies NVARCHAR(200) = ' '

SELECT @Hobbies = @Hobbies + hobbies + ',' FROM peoples_hobbies WHERE person_id = 5;

2
এটি আমি পেয়েছি: 'স্বীকৃত বিবৃতি প্রকার। (পজিশনে "DECLARE" এর নিকটে) '
ইসতিয়াক আহমেদ

1

আমাদের কাছে মাইএসকিএলে কলামগুলি যুক্ত করার দুটি উপায় রয়েছে

select concat(hobbies) as `Hobbies` from people_hobbies where 1

অথবা

select group_concat(hobbies) as `Hobbies` from people_hobbies where 1
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.