子查询从mysql返回多个行错误结果

时间:2016-11-04 11:55:09

标签: mysql

我有一个问题,我正在尝试通过数据库并显示作者基于搜索的所有书籍,其中我使用作者名称获取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."))

4 个答案:

答案 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'取代' ='在您的原始查询中,优化程序无法对查询做很多事情,它不灵活且难以维护。