একটি GROUP_CONCAT এ মাইএসকিউএল DISTINCT ()


185

আমি করছি SELECT GROUP_CONCAT(categories SEPARATOR ' ') FROM table। নীচে নমুনা তথ্য:

categories
----------
test1 test2 test3
test4
test1 test3
test1 test3

তবে, আমি test1 test2 test3 test4 test1 test3ফিরে আসছি এবং আমি ফিরে আসতে চাই test1 test2 test3 test4। কোন ধারনা?

অনেক ধন্যবাদ!

উত্তর:


363

GROUP_CONCAT এর DISTINCT বৈশিষ্ট্য রয়েছে:

SELECT GROUP_CONCAT(DISTINCT categories ORDER BY categories ASC SEPARATOR ' ') FROM table

48

DISTINCT ব্যবহার করে কাজ হবে

SELECT GROUP_CONCAT(DISTINCT(categories) SEPARATOR ' ') FROM table

রেফ: - এই



17

এই প্রশ্নের অন্যান্য উত্তরগুলি ওপি-র যা দরকার তা ফেরত দেয় না, তারা এর মতো একটি স্ট্রিং ফিরিয়ে দেবে:

test1 test2 test3 test1 test3 test4

(লক্ষ্য করুন test1এবং test3সদৃশ হয়ে গেছে) যখন ওপি এই স্ট্রিংটি ফিরে আসতে চায়:

test1 test2 test3 test4

এখানে সমস্যাটি হ'ল স্ট্রিংটি "test1 test3"নকল হয়েছে এবং কেবল একবার sertedোকানো হয়েছে, তবে অন্যান্য সমস্তগুলি একে অপরের "test1 test2 test3"সাথে স্বতন্ত্র ( "test1 test3"পুরো স্ট্রিংয়ের মধ্যে থাকা কয়েকটি পরীক্ষাগুলি নকল করা হলেও এর চেয়ে আলাদা )।

আমাদের এখানে যা করা দরকার তা হ'ল প্রতিটি স্ট্রিংকে বিভিন্ন সারিগুলিতে বিভক্ত করা এবং আমাদের প্রথমে একটি সংখ্যা সারণী তৈরি করতে হবে:

CREATE TABLE numbers (n INT);
INSERT INTO numbers VALUES
(1),(2),(3),(4),(5),(6),(7),(8),(9),(10);

তাহলে আমরা এই ক্যোয়ারীটি চালাতে পারি:

SELECT
  SUBSTRING_INDEX(
    SUBSTRING_INDEX(tableName.categories, ' ', numbers.n),
    ' ',
    -1) category
FROM
  numbers INNER JOIN tableName
  ON
    LENGTH(tableName.categories)>=
    LENGTH(REPLACE(tableName.categories, ' ', ''))+numbers.n-1;

এবং আমরা এর মতো ফলাফল পাই:

test1
test4
test1
test1
test2
test3
test3
test3

এবং তারপরে আমরা DISTINCT ধারাটি ব্যবহার করে GROUP_CONCAT সামগ্রিক ফাংশন প্রয়োগ করতে পারি:

SELECT
  GROUP_CONCAT(DISTINCT category ORDER BY category SEPARATOR ' ')
FROM (
  SELECT
    SUBSTRING_INDEX(SUBSTRING_INDEX(tableName.categories, ' ', numbers.n), ' ', -1) category
  FROM
    numbers INNER JOIN tableName
    ON LENGTH(tableName.categories)>=LENGTH(REPLACE(tableName.categories, ' ', ''))+numbers.n-1
  ) s;

অনুগ্রহপূর্বক এখানে দেখুন


এটি প্রদর্শিত হয় যে ওপির প্রশ্নের আপনার ব্যাখ্যাটি সঠিক হতে পারে; তবে, আমি মনে করি যে এটি উল্লেখ করা উচিত যে উপযুক্ত "বহু" -র-বহু সম্পর্কের জন্য "ব্লাহ_টো_শ্রেণীগুলি" এবং একটি "বিভাগ" টেবিল তৈরি করে তথ্যকে সাধারণকরণ করা এখানে সেরা অনুশীলন হবে এবং এতে প্রচুর নমনীয়তা যুক্ত হবে। তবুও, আপনার উত্তর হ'ল যে কেউ এই জাতীয় অস্বীকৃত স্কিমা উত্তরাধিকার সূত্রে উত্তম। এটি সম্ভবত পুরানো থেকে স্বাভাবিক স্কিমায় একটি স্থানান্তর উত্সর্গের উদ্দেশ্যে অভিযোজিত হতে পারে।
এক্সপি 84

11
SELECT
  GROUP_CONCAT(DISTINCT (category))
FROM (
  SELECT
    SUBSTRING_INDEX(SUBSTRING_INDEX(tableName.categories, ' ', numbers.n), ' ', -1) category
  FROM
    numbers INNER JOIN tableName
    ON LENGTH(tableName.categories)>=LENGTH(REPLACE(tableName.categories, ' ', ''))+numbers.n-1
  ) s;   

এটি স্বতন্ত্র মানগুলি যেমন: টেস্ট 1, টেস্ট 2, টেস্ট 4, টেস্ট 3 প্রদান করবে


5

আপনি কেবল সামনে DISTINCT যুক্ত করতে পারেন ।

SELECT GROUP_CONCAT(DISTINCT categories SEPARATOR ' ')

যদি আপনি বাছাই করতে চান,

SELECT GROUP_CONCAT(DISTINCT categories ORDER BY categories ASC SEPARATOR ' ')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.