MySQL अल्पविराम तार अलग - mysql

मेरे पास इस मूल्य के साथ मेरे डीबी पर स्थिति फ़ील्ड है

172:6,173:6,174:7

कहा पे 172,173, 174 मेरी आईडी और हैं 6,7 मेरी स्थिति अलग हो गई है : मेरी स्ट्रिंग में

अब मैं आईडी प्राप्त करने के लिए mysql में एक क्वेरी लिखना चाहता हूं जिसकी स्थिति है 6, आईडी प्राप्त करने के लिए मैं अपनी स्ट्रिंग कैसे विस्फोट कर सकता हूं।

मेरी पहली तालिका फ़ील्ड युक्त शिक्षा विवरण तालिका है

id   lead_ref  status
1      R-1      172:6,173:6,174:7

मेरी अगली टेबल आईडी शिक्षा लक्ष्य

id    target_course name
172      A
173      B
174      C

अब मैं इन दो टेबल में शामिल होना चाहता हूं और उन आईडी को प्राप्त करना चाहता हूं जिनकी स्थिति 6 है

उत्तर:

जवाब के लिए 0 № 1

यह संभव है, लेकिन ऐसा करने का तरीका आपको अपने डेटाबेस को फिर से डिजाइन करने के लिए प्रेरित करने के लिए बेहतर है, जैसा कि यह एक जीवित वातावरण में उपयोग करने के लिए कुछ है।

आप संघटन द्वारा संख्याओं की एक श्रृंखला उत्पन्न कर सकते हैंएक साथ स्थिरांक। यह आप संख्या 0 से 9 तक जोड़ते हैं और उसमें शामिल हो जाते हैं जो आप के खिलाफ 0 से 99 उत्पन्न कर सकते हैं (और एक और क्रॉस आपको 0 99 99, आदि देने के लिए शामिल हो सकता है)। आप अल्पविराम के आधार पर स्ट्रिंग को विभाजित करने के लिए SUBSTRING_INDEX के साथ इसका उपयोग कर सकते हैं।

चूंकि यह डुप्लिकेट प्रदान करेगा (उपयोग कर रहा हैsubstring_index इस तरह से आखिरी बार वापस लाएगा क्योंकि यह उस संख्या को अधिकतम संख्या में वापस करने के लिए लेता है, जिसके बाद आप इसे कॉपी करते हैं) आप DISTINCT का उपयोग कर सकते हैं।

SELECT DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(some_field, ",", 1 + units.i + tens.i * 10), ",", -1), ":", 1) AS id
FROM some_table
CROSS JOIN (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units
CROSS JOIN (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens
WHERE SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(some_field, ",", 1 + units.i + tens.i * 10), ",", -1), ":", -1)  = 6

यदि आप चाहते थे कि डुप्लिकेट सही लौटाएअल्पविराम से अलग मूल्यों की संख्या की जांच करने के लिए आपको कितनी बार आवश्यकता होती है (फ़ील्ड की लंबाई की तुलना फ़ील्ड की लंबाई की तुलना करें सभी अल्पविरामों के साथ अल्पविरामों की संख्या प्राप्त करने के लिए कुछ भी नहीं): -

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(some_field, ",", 1 + units.i + tens.i * 10), ",", -1), ":", 1) AS id
FROM some_table
CROSS JOIN (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units
CROSS JOIN (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens
WHERE SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(some_field, ",", 1 + units.i + tens.i * 10), ",", -1), ":", -1)  = 6
AND (units.i + tens.i * 10) <= (LENGTH(some_field) - LENGTH(REPLACE(some_field, ",","")))

ध्यान दें कि इनमें से दोनों केवल अधिकतम 100 अल्पविराम से अलग मूल्यों का सामना करते हैं। अधिक से निपटने के लिए उन्हें विस्तारित करना आसान है लेकिन इससे प्रश्नों को भी धीमा कर दिया जाएगा।

संपादित करें - अब आपके द्वारा ऊपर पोस्ट की गई डेमो तिथि के साथ स्थिति के लिए लक्ष्य पाठ्यक्रम का नाम प्राप्त करने के लिए: -

SELECT education_details.id, education.target_course_name
FROM education_details
CROSS JOIN (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units
CROSS JOIN (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens
INNER JOIN education ON SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(status, ",", 1 + units.i + tens.i * 10), ",", -1), ":", 1) = education.id
WHERE SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(status, ",", 1 + units.i + tens.i * 10), ",", -1), ":", -1)  = 6
AND (units.i + tens.i * 10) <= (LENGTH(status) - LENGTH(REPLACE(status, ",","")));

इसके लिए एसक्यूएल बेवकूफ: -

http://www.sqlfiddle.com/#!2/a2917/5


जवाब के लिए 0 № 2

तुम वहाँ जाओ:

SELECT `status`
FROM `table`
WHERE `status` LIKE `%:6,%`  -- if there is a matching status before a comma
OR `status` LIKE `%:6`;   -- if there is matching status as last item

एक स्ट्रिंग को विभाजित / विस्फोट करने के लिए MySQL में कोई आसान संभावना नहीं है। देख क्या आप एक MySQL क्वेरी में किसी फ़ील्ड को विभाजित / विस्फोट कर सकते हैं?


संबंधित सवाल
सबसे लोकप्रिय