2012-10-10 21 views
6

Tengo una relación n-to-m entre Author y Book.SQL select en la relación n a m

Tabla Autor

ID  Name 
1  Follett 
2  Rowling 
3  Martin 

Tabla libro

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

Tabla BOOK_AUTHOR

authorId  bookId 
1  3 
2  2 
3  1 
1  4 

Hay un montón más autores y libros en el sistema. Ahora quiero seleccionar todos los autores que tengan un libro en el género "Fantasy".

Esto es lo que ocurrió hasta ahora con:

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

Me pregunto cómo optimizar esta consulta ya que todo libro de mesa es muy grande.

+0

¿Las tablas tienen índices? En que columnas? –

Respuesta

5

Se recomienda utilizar un JOIN explícito en lugar de la combinación implícita (lista de tablas separadas por comas) que tiene actualmente, ya que mejorará la flexibilidad cuando necesite introducir uniones hacia la izquierda.

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' 

Si su book_author ha definido FOREIGN KEY relaciones de nuevo a las tablas author y books, entrará en vigencia índices. Del mismo modo, las respectivas columnas id en esas tablas se deben definir como PRIMARY KEY. Más allá de esto, la única optimización posible que puede hacer es crear un índice en 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

hola. Guau, respuesta rápida :). Gracias por la respuesta. De hecho, ya tengo los fk definidos así y los valores a los que se hace referencia son claves primarias. Gracias por su valiosa ayuda, usará las combinaciones explícitas. – taranaki

+1

+1 para recomendar el índice en books.category. También la categoría debe ser una tabla separada para evitar repetir el nombre de la categoría en cientos de filas. –

+0

El índice en la categoría existe :). Simplifiqué altamente el ejemplo para poder hacer una pregunta comprensible, por lo que la categoría no se repite muchas veces. Gracias por el aporte. – taranaki

Cuestiones relacionadas