2009-03-30 10 views
8

मेरे पास फिल्मों की एक सूची है जिसे मैंने पत्र द्वारा समूहीकृत किया है। स्वाभाविक रूप से, "टी" पत्र से शुरू होने वाली फिल्मों में लगभग 80% फिल्में हैं जो "द" से शुरू होती हैं। "द डार्क नाइट" जैसी फिल्मों को "डी" सूची में और विशेष रूप से "टी" में भी दिखाना चाहिए। किसी भी तरह से मैं ऐसा कर सकता हूँ?"the" शब्द को अनदेखा करते हुए, mysql में शीर्षक से आप कैसे ऑर्डर करते हैं?

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

WHERE movie_title REGEXP CONCAT('^(the)?', '$letter') 

जब मैं डेटाबेस में मौजूद सभी फिल्मों को प्रतिबिंबित करता हूं तो मैं इसे प्राप्त करना चाहता हूं।

+1

समीकरण में एक रिंच फेंकने के लिए: संख्याओं ("101 दालम") से शुरू होने वाले शीर्षकों को क्रमबद्ध किया जाना चाहिए, हालांकि संख्या का वर्णन किया गया था। इस मामले में, "ओ" के तहत। –

उत्तर

18

यदि आप अक्सर इस क्वेरी को निष्पादित करने जा रहे हैं, तो आप 'क्रमबद्ध' नाम के साथ तालिका में एक अलग फ़ील्ड बनाना चाहते हैं। नियमित अभिव्यक्तियों या अन्य परिचालनों का उपयोग करके MySQL को इंडेक्स का लाभ उठाना असंभव हो जाता है।

तो, सबसे आसान और सबसे कुशल समाधान है कि आप movie_title_short फ़ील्ड को जोड़ दें, जिसमें "द" या "ए" के बिना movie_title शामिल है। movie_title_short फ़ील्ड में भी एक इंडेक्स जोड़ना सुनिश्चित करें!

+0

याहू मैंने इसके बारे में सोचा, लेकिन कोई भी इसे निष्पादित नहीं किया जाएगा। –

+0

स्टोरेज स्पेस CPU समय से सस्ता है। बस एक title_order फ़ील्ड का उपयोग करें क्योंकि आप निश्चित रूप से एक ही मानदंड से आदेश देना चाहते हैं। – cletus

+0

इसके अलावा, एक अलग फ़ील्ड जोड़ने से "टी" और अन्य अक्षर सूची में एक ही फिल्म को प्रदर्शित करने की समस्या का समाधान नहीं होगा। –

1
select right(movie_title, char_length(movie_title)-4) as movie_title 
from movies 
where left(movie_title,3) = 'the' 
union 
select movie_title 
from movies 
1

आप mysql का उपयोग कर सकते चुनिंदा खंड में समारोह की जगह ...

select replace(movie_title,'The ','') from ... order by replace(movie_title,'The ','')' 
+0

नहीं, वह चाहता है कि "द" फिल्में दो बार दिखाई दें जब सभी एक साथ डंप हो जाएं - बिना 'के' के साथ। – GSerg

+0

यह वही WHERE-Clause का उपयोग करेगा। क्या आप -1 टिप्पणियां कर सकते हैं? :) – ashawley

6

के रूप में कार्ल कहा, मैं अपनी ही इंडेक्स करने योग्य क्षेत्र में इस निर्माण होता हर बार की गणना करने से बचने के लिए । हालांकि मैं अनावश्यकता से बचने के लिए इसे थोड़ा अलग तरीके से करने की सलाह दूंगा।

movies (id, name, namePrefix) 

जैसे:

| Dark Knight  | The | 
| Affair To Remember | An | 
| Beautiful Mind  | A | 

इस तरह से आप दो अलग अलग तरीकों इन फिल्मों को दिखा सकते हैं: "name, namePrefix" या "namePrefix name" और उसके अनुसार क्रमबद्ध किया जा सके।

+0

क्या किसी को पता है कि सॉर्टिंग के दौरान शीर्षकों को लूप करने के लिए शब्दों की एक कैनोलिक सूची है, जैसे कि "द", "एन" और "ए"। इसके अलावा, पूंजीकरण के लिए नियम: क्या यह "याद रखने का मामला" होना चाहिए या "याद रखने का मामला" होना चाहिए? – Evan

0

उपयोग करें:

SELECT * FROM movies ORDER BY TRIM(LEADING 'the ' FROM LOWER(`movie_title`)); 
1

बस ऐसे ही समस्या अपने आप था ... समाधान है:

SELECT * FROM movies WHERE title REGEXP '^d' AND title NOT REGEXP '^the ' OR title REGEXP '^the d' 

यह आप केवल वे परिणाम के साथ 'डी' या 'डी'

शुरू होता है दे देंगे
संबंधित मुद्दे