2011-03-31 10 views
7

की शुरुआत मैं इस तरह की समस्या के लिए दोनों MySQL और PostgreSQL समाधान के लिए देख रहा हूँ पर।साथ वर्णानुक्रम आदेश देने रिकॉर्ड "", "A", "एक" आदि varchar क्षेत्र

मैं एक title क्षेत्र के साथ रिकॉर्ड की एक संख्या है कहो। शीर्षक पुस्तक या मूवी खिताब हैं, जैसे "द कैट इन द हैट" और "रॉबिन हूड"। लेकिन जब शीर्षक उनके मूल रूप में प्रदर्शित किए जाने चाहिए, तो उन्हें पुस्तकालयों को क्रमबद्ध करने के तरीके में हल किया जाना चाहिए, जो किसी लेख को "द" या "एन" शीर्षक के अंत तक ले जा रहा है।

तो "टोपी में बिल्ली" को सॉर्ट किया गया है जैसे कि यह "बिल्ली में बिल्ली," था।

या तो सबसे अच्छा तरीका है स्कीमा डिजाइन या क्वेरी लिखें ताकि इन रिकॉर्ड एक ही तरीका है कि पुस्तकालयों शीर्षक सॉर्ट में शीर्षक से हल कर रहे हैं करने के लिए क्या है? (मैं यह भी चाहता हूं कि मैं इस प्रकार के ऑर्डरिंग के लिए तकनीकी शब्द जानता हूं।) इसके अलावा, मुझे किस प्रदर्शन विचारों के बारे में पता होना चाहिए और मुझे कौन से इंडेक्स बनाना चाहिए?

+0

या तो एक अच्छा विचार हो सकता है कि आप जिस प्रोग्राम का उपयोग कर रहे हैं, उसे डेटाबेस में लिखें। दूसरा विकल्प एक और "सॉर्टिंग फ़ील्ड" बनाना होगा जो एक रिकॉर्ड के प्रवेश पर ट्रिगर द्वारा पॉप्युलेट किया जाता है, और ट्रिगर इन शब्दों को निकाल लेगा और उन्हें आपके लिए अंत में रखेगा। – rayman86

+2

व्यक्तिगत रूप से, मैं एक और कॉलम जोड़ूंगा जहां मैं शीर्षक के लिए शीर्षक की पूर्व-गणना करता हूं। जब भी मुख्य शीर्षक संशोधित हो जाता है, तो मैं इस कॉलम को अपडेट कर दूंगा। सॉर्टिंग पर बहुत तेज़ होगा, मुझे लगता है। –

उत्तर

3

एक कस्टम समारोह है कि बनाएँ (sortableTitle, शायद?) है कि तार अपने अवांछित शब्दों के साथ शुरू संशोधित करेगा। order by sortableTitle(title) के साथ अपना प्रश्न कथन समाप्त करें। इसमें एक अतिरिक्त सीपीयू लागत होगी, हालांकि आपको यह जानने के लिए बेंचमार्क करना होगा कि कितना।

आप एक अतिरिक्त कॉलम (sortTitle) बना सकते हैं जो ट्रिगर द्वारा पॉप्युलेट किया जाता है। यह कुछ जगह लेगा, लेकिन फिर आपका सर्वर एक इंडेक्स द्वारा पंक्तियों को सॉर्ट करने में सक्षम होगा।

ऊपर जा सकता है (डेटाबेस सर्वर कोड को संशोधित करने के बिना) नहीं छोड़कर, आप सीधे एक सूचकांक आप चाहते हैं क्रम में है कि पैदा करते हैं। जहां तक ​​मैं कह सकता हूं, यह MySQL और PostgreSQL दोनों पर लागू होता है।

+2

PostgreSQL के लिए फ़ंक्शन पर एक इंडेक्स सॉर्टिंग को तेज़ करने के लिए बनाया जा सकता है: 'myEXtable (sortableTitle (title) पर INDEX sort_index बनाएं " –

+0

अच्छा! एक प्रश्न और मैंने एक जवाब और दो टिप्पणियां दी हैं जो मुझे बताती हैं कि मैं गलत हूं। अच्छा सुझाव! –

1
Select * from TitleTable 
Order by 
Case when substring(title,0,4) = 'The ' then substring(title, 4, len(title)-4) 
when substring(title,0,3) = 'An ' then substring(title, 3, len(title)-3) 
when substring(title,0,2) = 'A ' then substring(title, 2, len(title)-2) 
else title 
end 
4

आप क्यों नहीं बस मेज पर एक "title_prefix" क्षेत्र जोड़ सकते हैं और वहाँ इन सभी "" और "एक" तार के लिए कदम नहीं है? जब आप ऑर्डर कर रहे हों तो आप "शीर्षक" फ़ील्ड का उपयोग करेंगे, और जब आप शीर्षक पेश कर रहे हों तो आप किसी भी तरह से कंसल्टेशन कर सकते हैं।

+0

मैं +1/2 कहूंगा, लेकिन मुझे लगता है कि +1 तक के दौर। इसमें सम्मिलन कोड को संशोधित करने और दृश्य कोड को संशोधित करने या संशोधित करने की आवश्यकता है। दृश्य के लिए सीपीयू समय बहुत बुरा नहीं होना चाहिए, हालांकि। कुछ 'concat (ifnull (उपसर्ग, "", concat (",", उपसर्ग), शीर्षक)' उस क्षेत्र के लिए एक दृश्य में करेगा। –

+1

या कॉन्सट पर एक कॉल के साथ: 'ifnull (उपसर्ग, शीर्षक, concat (शीर्षक, ",", उपसर्ग)) ' –

1

मैं सुझाव दूंगा कि आप title फ़ील्ड को दो फ़ील्ड में विभाजित करें: mainTitle और pre

जब एक शीर्षक जोड़ दिया जाता है, तो देखें कि यह दो क्षेत्रों में 'ए', "" या अन्य उपसर्गों के साथ शुरू होता है और इसे विभाजित (शायद एक ट्रिगर के साथ)। आपका टेबल इस प्रकार दिखाई देगा:

| pre | mainTitle | 
|-----|----------------| 
| The | Cat in the Hat | 
| A | Space Odyssey | 
|  | Eyes Wide Shut | 

तो, आप mainTitle मैदान पर एक सूचकांक है और छँटाई के लिए उपयोग कर सकते हैं।

जब आप पूर्ण शीर्षक दिखाना चाहते हैं, तो दोनों फ़ील्ड को दो रूपों में से किसी एक में शामिल करें।


  • आप इस तरह से चुनते हैं, तो आप उसके अनुसार जब कोई उपयोगकर्ता आपके तालिका में खोज करने के लिए एक शीर्षक देता है के लिए कोड को संशोधित करना होगा। दिए गए शीर्षक को mainTitle फ़ील्ड खोजने से पहले उसी तरह विभाजित करना होगा।

  • आपको कोड (ट्रिगर या अन्य) के साथ बहुत सावधान रहना होगा जो विभाजन करता है इसलिए कुछ विशेष मामलों को सही तरीके से पकड़ा जाता है।आप A = B या A B C: learn the alphabet किताबें दिखाया गया है और = B, A और B C: learn the alphabet, A के रूप में हल कर दिया है नहीं करना चाहेंगे

2

आईट्यून जिसमें शीर्षक वांछित छँटाई प्रारूप में संग्रहीत किया जाता है एक दूसरे क्षेत्र होने और इस पर छँटाई के द्वारा प्राप्त करते हैं, शीर्षक के बजाय। यह सस्ता तरीका की तरह लगता है, लेकिन जब आप प्रत्येक शीर्षक पर स्ट्रिंग मैनिप्लेशंस करने के प्रदर्शन के प्रभाव पर विचार करते हैं, तो हर बार जब आप टाइटल द्वारा ऑर्डर करते हैं तो शीर्षक चुनते हैं, प्रत्येक बार जब आप शीर्षक डालें या अपडेट करते हैं तो स्ट्रिंग मैनिप्लेशंस करने के विरुद्ध, यह करता है सही बात।

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