2012-10-10 89 views
6

我有AuthorBook之間的n對m之間的關係。SQL選擇n到m的關係

表作者

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

你的表是否有索引?在哪些列上? – 2012-10-10 16:31:54

回答

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_author定義FOREIGN KEY關係回到authorbooks表,索引將被強制執行。同樣,這些表中相應的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

嗨。哇,快回復:)。謝謝你的答案。我其實已經有了像這樣定義的fk,並且引用的值是主鍵。感謝您的寶貴幫助,將使用顯式連接。 – taranaki

+1

+1,用於推薦books.category上的索引。此外,類別應該是分開的表格,以避免在數百行中重複類別的名稱。 –

+0

類別索引存在:)。我高度簡化了這個例子,以便能夠提出一個可以理解的問題,所以這個類別並沒有真正重複過很多次。感謝您的意見。 – taranaki