2012-10-10 18 views
6

Ich habe eine n-zu-m Beziehung zwischen Author und Book.SQL wählen in n zu m Beziehung

Tabelle Autor

ID  Name 
1  Follett 
2  Rowling 
3  Martin 

Table Book

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

Tabelle BOOK_AUTHOR

authorId  bookId 
1  3 
2  2 
3  1 
1  4 

Es gibt eine Menge mehr Autoren und Bücher im System. Jetzt möchte ich alle Autoren auswählen, die ein Buch im Genre "Fantasy" haben.

Dies ist, was ich mit so weit kam:

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"; 

Ich frage mich, wie diese Abfrage zu optimieren, da vor allem Büchertisch wirklich groß ist.

+0

Haben Ihre Tabellen Indizes? Auf welchen Spalten? –

Antwort

5

Es wird empfohlen, einen expliziten JOIN anstelle des impliziten Joins (kommaseparierte Tabellenname) zu verwenden, den Sie derzeit haben, da dies die Flexibilität verbessert, wenn Sie linke Joins einführen müssen.

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' 

Wenn Ihr book_authorFOREIGN KEY Beziehungen zurück zu den author und books Tabellen definiert ist, werden Indizes erzwungen werden. Ebenso sollten die entsprechenden id Spalten in diesen Tabellen als PRIMARY KEY definiert werden. Darüber hinaus besteht die einzige mögliche Optimierung darin, einen Index für books.category zu erstellen.

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

Hallo. Wow, schnelle Antwort :). Danke für die Antwort. Ich habe eigentlich schon die fk's so definiert und die referenzierten Werte sind Primärschlüssel. Danke für Ihre wertvolle Hilfe, die expliziten Joins verwenden. – taranaki

+1

+1 für den empfohlenen Index für books.category. Außerdem sollte die Kategorie eine getrennte Tabelle sein, um zu vermeiden, dass der Name der Kategorie in Hunderten von Zeilen wiederholt wird. –

+0

Der Index für Kategorie existiert :). Ich habe das Beispiel stark vereinfacht, um eine verständliche Frage stellen zu können, also wird die Kategorie nicht oft wiederholt. Danke für die Eingabe. – taranaki

Verwandte Themen