我有Book
和Author
桌子。Book
有很多Author
s(我知道它应该是多对多的,这只是为了这个例子)。
如何在一个 sql 查询中选择作者撰写的所有书籍:X和Y?
编辑
作者的数量可以是可变的 - 3、5 或更多作者。
我现在想不通(我试过做JOIN
s 和子查询)。
SELECT * FROM book ...
?
我有Book
和Author
桌子。Book
有很多Author
s(我知道它应该是多对多的,这只是为了这个例子)。
如何在一个 sql 查询中选择作者撰写的所有书籍:X和Y?
编辑
作者的数量可以是可变的 - 3、5 或更多作者。
我现在想不通(我试过做JOIN
s 和子查询)。
SELECT * FROM book ...
?
试试这个:
SELECT
B.Name
FROM Books B
JOIN Authors A
ON B.AuthorID = A.ID
WHERE A.Name IN ('X', 'Y')
GROUP BY B.Name
HAVING COUNT(DISTINCT A.ID) = 2
您可以双重加入作者表。
SELECT Book.* from Book
JOIN Author author1
ON author1.book_id = Book.id AND author1.author_name = 'Some Name'
JOIN Author author2
ON author2.book_id = Book.id AND author1.author_name = 'Some Other Name'
GROUP BY Book.id
JOIN 确保只返回两个作者的书,而 GROUP BY 只是使结果集只包含唯一条目。
值得注意的是,此查询将带回至少指定了两位作者的书籍。例如,如果您只需要 Smith 和 Jones 的书籍,而不是 Smith、Jones 和 Martin 的书籍,则此查询不会执行此操作。此查询将拉回至少包含Smith 和 Jones 的书籍。
从作者=....的书中选择*?
我发现很难理解你的结构,但这似乎是最好的方法?
希望这可以帮助
我假设您的 Author 表有一个 Book ID(因为这会给一本书的许多作者)。
SELECT * from Books Where ID IN
(SELECT BookID from Author A
JOIN Author B on A.BookID = B.BookID and A.ID <> B.ID
WHERE A.ID IN ('X', 'Y') AND B.ID IN ('X','Y'))
编辑:哈姆雷特的答案要好得多(可扩展)。