Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

एक स्ट्रिंग में अद्वितीय वर्णों की संख्या गिनें

यह मनोरंजन के लिए सही है?

SQL पंक्तियों के सेट को संसाधित करने के बारे में है, इसलिए यदि हम 'शब्द' को वर्णों के समूह में पंक्तियों के रूप में परिवर्तित कर सकते हैं तो हम उपयोगी सामग्री करने के लिए 'समूह' फ़ंक्शन का उपयोग कर सकते हैं।

सरल चरित्र हेरफेर करने के लिए 'रिलेशनल डेटाबेस इंजन' का उपयोग करना गलत लगता है। फिर भी, क्या केवल SQL के साथ आपके प्रश्न का उत्तर देना संभव है? हाँ यह है...

अब, मेरे पास हमेशा एक तालिका होती है जिसमें एक पूर्णांक स्तंभ होता है जिसमें लगभग 500 पंक्तियाँ होती हैं जिसमें आरोही क्रम 1 .. 500 होता है। इसे 'पूर्णांक' कहा जाता है। यह वास्तव में एक छोटी सी तालिका है जो बहुत अधिक उपयोग करती है इसलिए इसे स्मृति में कैश किया जाता है। इसे from 'select 1 ... union ... . से बदलने के लिए डिज़ाइन किया गया है प्रश्नों में पाठ।

यह किसी भी चीज़ की अनुक्रमिक पंक्तियों (एक तालिका) को उत्पन्न करने के लिए उपयोगी है, जिसे आप cross join में उपयोग करके एक पूर्णांक पर आधारित गणना कर सकते हैं। (कोई भी inner join ) मैं इसे एक वर्ष के लिए दिन उत्पन्न करने, अल्पविराम सीमांकित स्ट्रिंग्स आदि को पार्स करने के लिए उपयोग करता हूं।

अब, sql mid किसी दिए गए स्थान पर चरित्र को वापस करने के लिए फ़ंक्शन का उपयोग किया जा सकता है। 'पूर्णांक' तालिका का उपयोग करके मैं 'आसानी से' एक 'शब्द' को एक वर्ण तालिका में प्रति वर्ण एक पंक्ति के साथ परिवर्तित कर सकता हूं। फिर 'ग्रुप' फंक्शंस का इस्तेमाल करें...

SET @word='Hello World';

SELECT charAtIdx, COUNT(charAtIdx)
FROM (SELECT charIdx.id,
    MID(@word, charIdx.id, 1) AS charAtIdx 
    FROM integerseries AS charIdx
    WHERE charIdx.id <= LENGTH(@word)
    ORDER BY charIdx.id ASC
    ) wordLetters
GROUP BY
   wordLetters.charAtIdx
ORDER BY charAtIdx ASC  

आउटपुट:

charAtIdx  count(charAtIdx)  
---------  ------------------
                            1
d                           1
e                           1
H                           1
l                           3
o                           2
r                           1
W                           1

नोट:आउटपुट में पंक्तियों की संख्या स्ट्रिंग में विभिन्न वर्णों की संख्या है। इसलिए, यदि आउटपुट पंक्तियों की संख्या की गणना की जाती है तो 'भिन्न अक्षरों' की संख्या ज्ञात हो जाएगी।

इस अवलोकन का उपयोग अंतिम क्वेरी में किया जाता है।

अंतिम प्रश्न:

यहां दिलचस्प बात यह है कि 'पूर्णांक' 'क्रॉस जॉइन' प्रतिबंध (1 .. लंबाई (शब्द)) को where में करने के बजाय वास्तविक 'जॉइन' में स्थानांतरित करना है। खंड। यह ऑप्टिमाइज़र को सुराग प्रदान करता है कि join . करते समय उत्पादित डेटा को कैसे प्रतिबंधित किया जाए .

SELECT 
   wordLetterCounts.wordId,
   wordLetterCounts.word,   
   COUNT(wordLetterCounts.wordId) AS letterCount
FROM 
     (SELECT words.id AS wordId,
             words.word AS word,
             iseq.id AS charPos,
             MID(words.word, iseq.id, 1) AS charAtPos,
             COUNT(MID(words.word, iseq.id, 1)) AS charAtPosCount
     FROM
          words
          JOIN integerseries AS iseq
               ON iseq.id BETWEEN 1 AND words.wordlen 
      GROUP BY
            words.id,
            MID(words.word, iseq.id, 1)
      ) AS wordLetterCounts
GROUP BY
   wordLetterCounts.wordId  

आउटपुट:

wordId  word                  letterCount  
------  --------------------  -------------
     1  3333333333                        1
     2  1113333333                        2
     3  1112222444                        3
     4  Hello World                       8
     5  funny - not so much?             13

वर्ड टेबल और डेटा:

CREATE TABLE `words` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `word` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL,
  `wordlen` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

/*Data for the table `words` */

insert  into `words`(`id`,`word`,`wordlen`) values (1,'3333333333',10);
insert  into `words`(`id`,`word`,`wordlen`) values (2,'1113333333',10);
insert  into `words`(`id`,`word`,`wordlen`) values (3,'1112222444',10);
insert  into `words`(`id`,`word`,`wordlen`) values (4,'Hello World',11);
insert  into `words`(`id`,`word`,`wordlen`) values (5,'funny - not so much?',20);

पूर्णांक तालिका:इस उदाहरण के लिए श्रेणी 1 .. 30।

CREATE TABLE `integerseries` (
  `id` int(11) unsigned NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=500 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. इंसर्ट स्टेटमेंट जो डालने से पहले डुप्लिकेट की जाँच करता है

  2. MySQL व्यू कैसे काम करते हैं?

  3. C++ प्रोग्राम MySQL डेटाबेस के साथ संचार करता है

  4. डेल्फी में एक मैसकल डेटाबेस से कनेक्ट करने का सबसे अच्छा तरीका क्या है?

  5. लाइक और वाइल्डकार्ड का उपयोग करके MySQL खोज का अनुकूलन