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

उन सभी का चयन करें जहां फ़ील्ड में अल्पविराम द्वारा अलग की गई स्ट्रिंग है

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 ), और अच्छे कारण के लिए।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. GROUP BY से उच्चतम या निम्नतम मान वाली पंक्ति प्राप्त करें

  2. एसक्यूएल अगर चयन क्वेरी शून्य है तो दूसरी क्वेरी करें

  3. यह बहुभुज वस्तु अपने आप बंद हो जाती है। यह इंसर्ट अभी भी त्रुटि 3037 के साथ क्यों विफल हो रहा है:अमान्य GIS डेटा?

  4. mysql_real_escape_string के साथ php filter_var का उपयोग करना

  5. MySQL में SUM परिणाम का डेटाटाइप