mysql - আমি কি একাধিক মাইএসকিউএল সারি এক ক্ষেত্রে সংহত করতে পারি?
concat group-concat (7)
MySQL
ব্যবহার MySQL
, আমি কিছু করতে পারি:
SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;
আমার আউটপুট:
shopping
fishing
coding
কিন্তু পরিবর্তে আমি শুধু 1 সারি, 1 কোল চাই:
প্রত্যাশিত আউটপুট:
shopping, fishing, coding
কারণ আমি একাধিক টেবিল থেকে একাধিক মান নির্বাচন করছি, এবং সব যোগদান পরে আমি অনেক চাই আমি চেয়ে বেশি সারি আছে।
আমি MySQL ডক-এ একটি ফাংশন সন্ধান করেছি এবং এটি CONCAT
বা CONCAT_WS
ফাংশনগুলির মত ফলাফল সেট গ্রহণ করে না, তাই কেউ এখানে কীভাবে এটি করতে জানে?
একাধিক, পৃথক সারি concatenate বিকল্প সিনট্যাক্স
সতর্কতা: এই পোস্টটি আপনাকে ক্ষুধার্ত করবে।
প্রদত্ত:
আমি নিজেকে একাধিক, একাধিক সারি নির্বাচন করতে চেয়েছিলাম-একটি গ্রুপের পরিবর্তে-এবং একটি নির্দিষ্ট ক্ষেত্রের সাথে সংযুক্ত করা।
ধরুন আপনার পণ্য আইডির একটি টেবিল এবং তাদের নাম এবং মূল্য রয়েছে:
+------------+--------------------+-------+
| 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 |
+------------+--------------------+-------+
তারপরে আপনার কিছু ফ্যান্সি-স্কমান্সি AJAX রয়েছে যা চেকবক্সগুলির মতো এই কুকুরগুলিকে তালিকাভুক্ত করে।
আপনার ক্ষুধার্ত-হিপ্পো ব্যবহারকারী 13, 15, 16
নির্বাচন করে। আজ তার জন্য কোন ডেজার্ট ...
খুঁজুন:
বিশুদ্ধ MySQL সঙ্গে, এক লাইন আপনার ব্যবহারকারীর ক্রম সংক্ষিপ্ত করার একটি উপায়।
সমাধান:
IN
clause সহ GROUP_CONCAT
ব্যবহার করুন:
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()
চান তবে SUM()
টস করুন 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 |
+------------------------------------------------+-------+
পিএসঃ যদি আপনার কাছে ইন-এন-আউট না থাকে তবে ক্ষমাপ্রার্থী ...
আপনি 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
);
আমাদের MySQL এ কলাম সংহত করার দুটি উপায় আছে
select concat(hobbies) as `Hobbies` from people_hobbies where 1
অথবা
select group_concat(hobbies) as `Hobbies` from people_hobbies where 1
আমার কাছে আরও জটিল প্রশ্ন ছিল এবং এটি পাওয়া যায় যে আমাকে এটিতে কাজ করার জন্য বাইরের প্রশ্নের মধ্যে 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;
এই কেউ সাহায্য করতে পারে আশা করি।
একটি GROUP সমষ্টিগত ফাংশন আছে, GROUP_CONCAT ।
এটা চেষ্টা কর:
DECLARE @Hobbies NVARCHAR(200) = ' '
SELECT @Hobbies = @Hobbies + hobbies + ',' FROM peoples_hobbies WHERE person_id = 5;
GROUP_CONCAT
এ আপনার নজর রাখুন যদি আপনার MySQL সংস্করণ (4.1) এটি সমর্থন করে। আরো বিস্তারিত জানার জন্য GROUP_CONCAT দেখুন।
এটা ভালো কিছু দেখতে হবে:
SELECT GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies
WHERE person_id = 5
GROUP BY 'all';