2009-10-19 9 views
34

मुझे 'कार्ड' नामक आईएनएनओडीबी तालिका में लगभग 20,000 पंक्तियां मिली हैं, इसलिए FULLTEXT एक विकल्प नहीं है।MySQL - रिलेवेंस द्वारा ऑर्डर कैसे करें? INNODB तालिका

इस तालिका पर विचार करें:

id  |  name  |  description 
---------------------------------------------------------- 
1  John Smith  Just some dude 
2  Ted Johnson  Another dude 
3  Johnathan Todd This guy too 
4  Susan Smith  Her too 
5  Sam John Bond And him 
6  John Smith  Same guy as num 1, another record 
7  John Adams  Last guy, promise 

तो, 'जॉन' के लिए कहते हैं कि उपयोगकर्ता खोजों, मैं परिणाम के क्रम में होना निर्धारित हैं:

7  John Adams 
6  John Smith 
3  Johnathan Todd 
5  Sam John Bond 
2  Ted Johnson 

कृपया ध्यान दें कि हम एक बार 'जॉन स्मिथ' को एक बार खींच लिया है, हमने अपनी सबसे हालिया प्रविष्टि ली है। मेरे डेटा के कारण, सभी नाम एक ही सटीक व्यक्ति के लिए हैं, जॉन स्मिथ नामक 2 अलग-अलग लोगों की चिंता करने की आवश्यकता नहीं है। विचार? अगर मैं कुछ भी स्पष्ट कर सकता हूं तो मुझे बताएं।

+1

आप नहीं प्रासंगिकता के आधार पर (हालांकि आपको लगता है कि परिभाषित) "अंतिम नाम, firstname" द्वारा ऑर्डर करने के लिए चाहते करने लगते हैं। क्या ये सही है? – Tomalak

उत्तर

110

संस्करण 1:

SELECT max(id) id, name 
    FROM cards 
WHERE name like '%John%' 
GROUP BY name 
ORDER BY CASE WHEN name like 'John %' THEN 0 
       WHEN name like 'John%' THEN 1 
       WHEN name like '% John%' THEN 2 
       ELSE 3 
      END, name 

संस्करण 2:

SELECT max(id) id, name 
    FROM cards 
WHERE name like '%John%' 
GROUP BY name 
ORDER BY CASE WHEN name like 'John%' THEN 0 
       WHEN name like '% %John% %' THEN 1 
       WHEN name like '%John' THEN 2 
       ELSE 3 
      END, name 
+0

बहुत बढ़िया! यह वही काम करता है जैसा मैं चाहता था। धन्यवाद najmeddine! – k00k

+1

मदद करने में खुशी हुई। मैंने इसे और मामलों को संभालने के लिए थोड़ा सा संशोधित किया। – manji

+0

मुझे लगता है कि दूसरा तरीका मेरे विशिष्ट मामले में बेहतर काम करता है, लेकिन वे दोनों दूसरों के लिए सहायक हो सकते हैं, क्या आप दोनों को जन्म के लिए वहां रख सकते हैं? – k00k