MySQL DISTINCT एक GROUP_CONCAT () पर


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। कोई विचार?

बहुत धन्यवाद!

जवाबों:



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"को डुप्लिकेट किया गया है और केवल एक बार डाला गया है, लेकिन सभी अन्य एक दूसरे के "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;

कृपया यहाँ फिडल देखें ।


ऐसा प्रतीत होता है कि ओपी के प्रश्न की आपकी व्याख्या सही हो सकती है; हालाँकि, मुझे लगता है कि यह ध्यान दिया जाना चाहिए कि उपयुक्त कई-से-कई संबंधों के लिए "blah_to_categories" और "श्रेणियां" तालिका बनाकर डेटा को सामान्य करना यहाँ सबसे अच्छा अभ्यास होगा, और इसमें बहुत लचीलापन होगा। फिर भी, आपका जवाब किसी भी व्यक्ति के लिए एक स्मार्ट वर्कअराउंड है जो इस तरह के एक असामान्य स्कीमा को विरासत में मिला है। यह संभवतः पुराने से सामान्यीकृत स्कीमा में माइग्रेशन उत्पन्न करने के उद्देश्य से भी अनुकूलित किया जा सकता है।
XP84

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;   

यह अलग मान लौटाएगा जैसे: test1, test2, test4, test3


5

आप बस सामने DISTINCT जोड़ सकते हैं ।

SELECT GROUP_CONCAT(DISTINCT categories SEPARATOR ' ')

यदि आप छाँटना चाहते हैं,

SELECT GROUP_CONCAT(DISTINCT categories ORDER BY categories ASC SEPARATOR ' ')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.