2010-03-02 12 views
9

खोजें राशि परीक्षण स्ट्रिंग engine/mail/key और जो इस तरह दिखता है एक मेज निम्नलिखित:मैं MySQL (InnoDB) में सर्वश्रेष्ठ मिलान पंक्ति

+-------------+ 
| query  | 
+-------------+ 
| engine  | 
| engine/pdf | 
| engine/mail | 
+-------------+ 

मैं सर्वश्रेष्ठ मिलान पंक्ति लगाना चाहते हैं। सर्वोत्तम मिलान स्ट्रिंग/पंक्ति की शुरुआत से सबसे मिलान करने वाले वर्णों द्वारा निर्दिष्ट किया जाता है।

मैंने एक RegExp बनाया है, लेकिन यह निश्चित रूप से सभी पंक्तियों से मेल खाता है और मुझे कोई भी जानकारी नहीं देगी जिसके बारे में अधिकतर वर्ण/भागों से मेल खाता है।
Regexp: ^engine(/mail(/key)?)?

मैं इस तरह MySQL के FIND_IN_SET समारोह का उपयोग कर के बारे में एक अन्य विचार था:

`FIND_IN_SET(query,'engine,engine/mail,engine/mail/key')` 

और परिणाम के आदेश में यह उत्पादन है द्वारा।

यह काम करेगा, लेकिन यह किसी भी तरह से एक अच्छा समाधान नहीं है। क्या किसी के पास इसके बारे में बेहतर विचार है?

उत्तर

9

बस LIKE का उपयोग करें, लेकिन दूसरी बार जिस तरह से संभवतः आप इसका उपयोग करते हैं।

select query 
from table1 
where 'engine/mail/key' like concat(query,'%') 
order by length(query) desc 
limit 1 

परिणाम:

mysql> select * from query; 
+-------------+ 
| query  | 
+-------------+ 
| engine  | 
| engine/pdf | 
| engine/mail | 
+-------------+ 
3 rows in set (0.00 sec) 

mysql> select query from query 
     where 'engine/mail/key' like concat(query,'%') 
     order by length(query) desc 
     limit 1; 
+-------------+ 
| query  | 
+-------------+ 
| engine/mail | 
+-------------+ 
1 row in set (0.01 sec) 
+1

यह कुछ भी मेल नहीं खाता। 'LENGTH (क्वेरी)' द्वारा ऑर्डर करना पर्याप्त नहीं है, क्योंकि वहां 'इंजन/वेबसाइट' जैसी पंक्ति हो सकती है जिसे तब 'इंजन/मेल' पर चुना जाएगा। –

+0

क्षमा करें, मैंने क्वेरी को सही कर दिया है, इसलिए अब यह चल जाएगा। यह देखने के लिए अभी आज़माएं कि यह आपको परिणाम प्रदान कर रहा है या नहीं। –

+0

इसके लिए धन्यवाद, 'FIND_IN_SET' हैक से कहीं बेहतर है! इस तरह के आसपास के रास्ते में 'LIKE' का उपयोग करना वास्तव में एक साफ चाल है! –

संबंधित मुद्दे