sql查询只返回一个条目,而它应该返回几个条目

6yoyoihd  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(257)

我正在创建一个图书标签系统,并尝试调用所有具有相同标签的图书。我的查询只显示第一本书,而不是下面任何一本具有相同标签的书。
这是数据库的books表

drop table if exists books;

      create table books (
      isbn_13 varchar (13) primary key,
      title varchar (100),
      author varchar (80),
      publish_date date,
      price decimal (6,2),
      content bytea
    );

以下是数据库的book\u tags表:

CREATE TABLE book_tags
    (
        isbn_13 character varying(13) NOT NULL,
        tag_names character varying(100) NOT NULL,
        CONSTRAINT book_tags_pkey PRIMARY KEY (isbn_13, tag_names),
        CONSTRAINT book_tags_isbn_13_fkey FOREIGN KEY (isbn_13)
            REFERENCES public.books (isbn_13) MATCH SIMPLE
            ON UPDATE NO ACTION
            ON DELETE NO ACTION
    )

下面是调用查询的booktagdaoimpl文件:

public List<Book> getBooksByTag(String tag) {
    List<Book> books = new ArrayList<>();

    try {
        connection = DAOUtilities.getConnection();
        String sql = "SELECT * FROM books INNER JOIN BOOK_TAGS ON tag_names=?";
        stmt = connection.prepareStatement(sql);

        stmt.setString(1, tag);

        ResultSet rs = stmt.executeQuery();

        if (rs.next()) {
            Book book = new Book();

            book.setIsbn13(rs.getString("isbn_13"));
            book.setAuthor(rs.getString("author"));
            book.setTitle(rs.getString("title"));
            book.setPublishDate(rs.getDate("publish_date").toLocalDate());
            book.setPrice(rs.getDouble("price"));
            book.setContent(rs.getBytes("content"));    

            books.add(book);
        }
        System.out.println("seeing if it will pull multiple books from one tag" + books);

    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        closeResources();
    }

    return books;
}
j9per5c4

j9per5c41#

作为开门红 if 声明应该是 while 改为循环。
但是,这也是您的查询的一个问题:

SELECT * FROM books INNER JOIN BOOK_TAGS ON tag_names=?

这两个表之间缺少一个连接条件,因此只要其中至少有一个具有searched标记,它就基本上返回所有图书。大概你想要:

SELECT * 
FROM books b
INNER JOIN BOOK_TAGS bt ON bt.isbn_13 = b.isbn_13
WHERE bt.tag_names = ?

你不妨用 EXISTS :

SELECT b.*
FROM books b
WHERE EXISTS (
    SELECT 1
    FROM book_tags bt
    WHERE bt.isbn_13 = b.isbn_13 AND bt.tag_names = ?
)
lo8azlld

lo8azlld2#

String sql = "SELECT * FROM books INNER JOIN BOOK_TAGS ON tag_names=?";

连接语法不是这样工作的。我想你的意思是

SELECT * FROM books b INNER JOIN BOOK_TAGS t 
    ON b.isbn_13 = t.isbn_13 where t.tag_names=?";

因为它是一个内部连接,所以你不会得到任何没有匹配标签行的书。
您还有另一个问题,因为很难找到单个标记或标记的子集,因为您需要这样做 where tag_names like '%value%' . 每个标记记录应该有一个标记。

相关问题