2012-10-10 15 views
6

मेरे पास n-to-mAuthor और Book के बीच संबंध है।एसक्यूएल एन से रिश्ते में चयन करें

तालिका लेखक

ID  Name 
1  Follett 
2  Rowling 
3  Martin 

टेबल बुक

ID  Title      Category 
1  A Dance with Dragons  Fantasy 
2  Harry Potter    Fantasy 
3  The Key to Rebecca  Thriller 
4  World without end   Drama 

टेबल BOOK_AUTHOR

authorId  bookId 
1  3 
2  2 
3  1 
1  4 

एक बहुत हैं सिस्टम में अधिक लेखकों और किताबें। अब मैं उन सभी लेखकों को चुनना चाहता हूं जिनके पास शैली में एक पुस्तक है "काल्पनिक"।

यह है कि मैं क्या साथ अब तक आए हैं:

select distinct a.id 
    from author a, book b, written w 
    where w.authorId = a.id and w.bookId = b.id and b.category = "Fantasy"; 

मैं कैसे इस क्वेरी अनुकूलन करने के लिए के बाद से विशेष रूप से टेबल बुक वास्तव में बड़ी है सोच रहा हूँ।

+0

क्या आपके टेबल में अनुक्रमणिका है? किस कॉलम पर? –

उत्तर

5

वर्तमान में आपके पास शामिल होने वाली निहित (अल्पविराम से अलग तालिका सूची) के बजाय एक स्पष्ट JOIN का उपयोग करने की अनुशंसा की जाती है, क्योंकि यदि आपको बाएं जुड़ने की आवश्यकता होती है तो यह लचीलापन में सुधार करेगा।

SELECT 
    DISTINCT a.id 
FROM 
    author a 
    JOIN book_author ba ON a.id = ba.authorId 
    JOIN books b ON b.id = ba.bookId 
WHERE b.category = 'Fantasy' 

अपने book_authorauthor और books तालिकाओं के लिए वापस FOREIGN KEY रिश्तों में परिभाषित किया गया है, तो अनुक्रमणिका से लागू किया जाएगा। इसी तरह, उन तालिकाओं में संबंधित id कॉलम को PRIMARY KEY के रूप में परिभाषित किया जाना चाहिए। इसके अलावा, एकमात्र संभावित अनुकूलन आप कर सकते हैं books.category पर एक सूचकांक बनाना।

CREATE TABLE book_author (
    authorId INT NOT NULL, /* or whatever the data type... */ 
    bookId INT NOT NULL, 
    /* define FK constraints in book_author */ 
    FOREIGN KEY (authorId) REFERENCES author (id), 
    FOREIGN KEY (bookId) REFERENCES books (id) 
); 
+0

हाय। वाह, तेज जवाब :)। जवाब के लिए धन्यवाद। मेरे पास वास्तव में पहले से ही एफके की परिभाषा है और संदर्भित मान प्राथमिक कुंजी हैं। आपकी बहुमूल्य मदद के लिए धन्यवाद, स्पष्ट जुड़ने का उपयोग करेगा। Books.category पर इंडेक्स की सिफारिश करने के लिए – taranaki

+1

+1। सैकड़ों पंक्तियों में श्रेणी के नाम को दोहराने से बचने के लिए श्रेणी भी एक अलग तालिका होनी चाहिए। –

+0

श्रेणी पर सूचकांक मौजूद है :)। मैंने समझने योग्य प्रश्न पूछने में सक्षम होने के लिए उदाहरण को बहुत सरल बना दिया है, इसलिए श्रेणी को वास्तव में कई बार दोहराया नहीं जाता है। इनपुट के लिए धन्यवाद। – taranaki

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