La query in questo caso risulta un po' articolata, e va costruita per passi. Dati i nomi degli autori per cui si vuole cercare: x1, x2, ..., xn
- estrai gli id di tutti i libri trai cui autori figura almeno x1
- interseca il risultato precedente con gli id di tutti i libri trai cui autori figura almeno x2
- ripeti il punto precedente per ogni autore x3, ..., xn, sempre intersecando i risultati
- filtra il risultato ottenuto mantenendo gli id di tutti i libri che hanno esattamente n autori
- contestualmente al punto precedente puoi anche incrociare gli id così ottenuti con quelli della tabella dei libri per recuperarne i titoli o altre informazioni
Concretamente, per due autori con nomi X, Y e per una struttura di tabelle con nomi ragionevoli:
Codice:
SELECT book.id, book.title FROM
(SELECT book.id, COUNT(author_id) AS authors_number FROM
(SELECT book.id from
(SELECT book_id AS id FROM book_author JOIN author ON book_author.author_id = author.id WHERE author.name = "X") AS book
INNER JOIN book_author ON book.id = book_author.book_id
INNER JOIN author ON book_author.author_id = author.id
WHERE author.name = "Y"
) AS book
INNER JOIN book_author ON book.id = book_author.book_id
GROUP BY book.id
) AS book_info
INNER JOIN book ON book_info.id = book.id
WHERE book_info.authors_number = 2;
Con nomi strani ed INSPIEGABILMENTE IN MAIUSCOLO che hai usato tu, invece:
Codice:
SELECT TESTI.ID, TESTI.TESTO FROM
(SELECT TESTI.ID, COUNT(AUTHORID) AS authors_number FROM
(SELECT TESTI.ID AS id from
(SELECT TESTIID AS id FROM Lookup_TESTI_AUTORI JOIN AUTORI ON Lookup_TESTI_AUTORI.AUTHORID = AUTORI.ID WHERE AUTORI.NOMINATIVO = "X") AS book
INNER JOIN Lookup_TESTI_AUTORI ON book.id = Lookup_TESTI_AUTORI.TESTIID
INNER JOIN AUTORI ON Lookup_TESTI_AUTORI.AUTHORID = AUTORI.ID
WHERE AUTORI.NOMINATIVO = "Y"
) AS book
INNER JOIN Lookup_TESTI_AUTORI ON book.id = Lookup_TESTI_AUTORI.TESTIID
GROUP BY book.id
) AS book_info
INNER JOIN TESTI ON book_info.id = TESTI.ID
WHERE book_info.authors_number = 2;