8

との間にはn対mの関係がAuthorあり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";

特にテーブルブックは本当に大きいので、このクエリを最適化する方法を考えています。

4

1 に答える 1

9

現在使用している暗黙的(コンマ区切りのテーブルリスト)結合ではなく明示的結合を使用することをお勧めします。これ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 KEYauthorbooksidPRIMARY KEYbooks.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)
);
于 2012-10-10T16:31:55.267 に答える