MySQL के साथ, आप FIND_IN_SET()
. का उपयोग कर सकते हैं :
SELECT * FROM mytable WHERE FIND_IN_SET('ios ', tags) > 0;
http://dev.mysql .com/doc/refman/5.0/hi/string-functions.html#function_find-in-set
ध्यान दें कि FIND_IN_SET
स्ट्रिंग्स अल्पविराम होने की अपेक्षा करता है अलग किया गया, न कि अल्पविराम और स्थान अलग। तो आपको लास्ट टैग की समस्या हो सकती है। वास्तव में सबसे अच्छा तरीका यह होगा कि तालिका को सामान्य करें; अन्यथा आप tags
. से रिक्त स्थान को मिटा सकते हैं कॉलम; अंत में आप tags
. में एक स्थान जोड़कर समस्या का समाधान कर सकते हैं कॉलम:
SELECT * FROM mytable WHERE FIND_IN_SET('ios ', CONCAT(tags,' ')) > 0;
यदि टैग की संख्या सीमित है, तो आप कॉलम को SET
. में बदलने पर विचार कर सकते हैं . इससे दक्षता में काफी सुधार होगा।
अपडेट करें
सिवाय इसके कि मुझे रिक्त स्थान मिले गलत . वे पहले . हैं तार और उसके बाद नहीं।
तो:
SELECT * FROM mytable WHERE FIND_IN_SET(' ios', CONCAT(' ', tags)) > 0;
लेकिन फिर से, उन रिक्त स्थान से छुटकारा पाएं - वे परेशानी के अलावा और कुछ नहीं हैं :-)
अपडेट 2
उपरोक्त काम करता है, ठीक है। लेकिन, आप मेरे पक्ष में लगभग इतना ही कह सकते हैं। न केवल समाधान काफी * में * कुशल है, यह सिस्टम को अचूक के बगल में भी बनाता है (वहां गया, ऐसा किया, टी-शर्ट और उसके नीचे एक चबाने वाला गधा मिला)। तो मैं अब सामान्यीकरण के पक्ष में थोड़ा वीणा दूंगा, यानी, कम से कम ये दो और टेबल:
CREATE TABLE tags ( id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
tagName varchar(32) // I'm a bit of a cheapskate
);
CREATE TABLE has_tag ( tableid INTEGER, tagid INTEGER );
यह कितना बेहतर है? मुझे तरीके गिनने दो।
- आप आसानी से अधिक लचीली क्वेरी जोड़ सकते हैं ("आईओएस, सी ++, ..." में सभी टैग हैं या "इनमें से कम से कम तीन टैग हैं:(आईओएस, पायथन, एसक्यूएल, .नेट, हास्केल)"। हां, आप इसे
FIND_IN_SET
के साथ कर सकते हैं , लेकिन मुझ पर विश्वास करें, आप इसका आनंद नहीं लेंगे । - आपके पास एक नियंत्रित शब्दकोश है टैग, जो आपको यह जांचने में सक्षम बनाता है कि क्या कोई टैग ज्ञात है (साथ ही ड्रॉप-डाउन कॉम्बो बॉक्स जैसी आसानी से सूचियां उत्पन्न करता है, या - क्या किसी ने 'jQuery स्वतः पूर्ण' कहा है?)।
- कुछ डिस्क अचल संपत्ति बचाता है (टैग एक बार लिखे जाते हैं)
- खोजें तेज़ हैं . यदि आप उन टैग्स को पहले से जानते हैं जिन्हें आप ढूंढ रहे हैं और उन्हें टैग आईडी में पूर्व-संकलित करते हैं, तो वे चलते समय फुटपाथ पर SQL रबर के निशान छोड़ देंगे (पूर्णांक के लिए अनुक्रमित खोज) मूल्य!)। और टैग जो संकलित नहीं होंगे वहां नहीं होंगे , और आपको यह खोज शुरू होने से पहले ही पता चल जाएगा।
- टैग का नाम बदलना बहुत आसान बनाता है
- किसी भी संख्या को पकड़ सकता है टैग की संख्या (आप कुछ टैग को 'आईओएस डेवलपमेंट' में जल्दी या बाद में छोटा करने का जोखिम उठाते हैं...)
मेरा मानना है कि "सीएसवी फ़ील्ड" एसक्यूएल एंटीपैटर्न के बीच सेंसर (या) एड है ( http://pragprog.com/book/bksqla/sql-antipatterns ), और अच्छे कारण के लिए।