यह मनोरंजन के लिए सही है?
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