我有一个问题,我正在尝试通过数据库并显示作者基于搜索的所有书籍,其中我使用作者名称获取isbn,然后查找该isbn的所有详细信息...好吧,如果作者写了一本书,它显示了一行,但是当作者写了不止一本书时,它给了我一个错误......我做错了什么,请你帮忙......这是我的代码。
SELECT* FROM books WHERE isbn=(SELECT isbn FROM books_authors
WHERE author_id IN
(SELECT author_id FROM authors WHERE first_name ="J.K."))
答案 0 :(得分:2)
更改为:
SELECT* FROM books WHERE isbn in (SELECT isbn FROM books_authors
WHERE author_id IN
(SELECT author_id FROM authors WHERE first_name ="J.K."))
如果子查询返回多个结果,则无法isbn=(subquery)
。
答案 1 :(得分:2)
尝试:
SELECT * FROM books
WHERE isbn IN (SELECT isbn FROM books_authors
WHERE author_id IN (SELECT author_id
FROM authors
WHERE first_name ="J.K."
)
) ;
请注意,最外面的选择也应该有WHERE isbn IN...
。
答案 2 :(得分:2)
您可以执行此查询以避免subselect和in子句(使用join)
SELECT * FROM books
INNER JOIN books_authors on books_authors.isbn = books.isbn
INNER JOIN authors on authors.author_id = books_authors.author_id
WHERE authors.first_name = J.K.";
无论如何,您的错误发生是因为您使用的是=而不是在您的第一部分SELECT* FROM books WHERE isbn=(SELECT isbn FROM ...
中我想要使用您的查询,您应该使用SELECT* FROM books WHERE isbn in (SELECT isbn FROM .....
答案 3 :(得分:2)
当你可以使用连接获得所需的结果时,永远不要使用嵌套的子查询,特别是在MySQL上:
SELECT b.*
FROM books b
INNER JOIN books_authors ba
ON b.isbn=ba.isbn
INNER JOIN authors a
ON ba.author_id=a.author_id
WHERE a.first_name ="J.K.";
虽然您可以使用' IN'取代' ='在您的原始查询中,优化程序无法对查询做很多事情,它不灵活且难以维护。