SQL - Return 用户拥有的图书

SQL - Return books that user owns

我在做我在我的大学项目中执行查询时遇到了一些问题。我有一个网站,用户可以在其中分享他们读过的书,我有一个页面,用户可以在其中查看他添加的书(他拥有的书)。

为此,我相信我需要登录用户的 ID,我将其存储在会话 PHP 变量中,用户 ID 在 table 用户中。 关于书籍的信息存储在 table 本书中,它有自己的 id 主键。 然后,为了显示谁拥有我拥有的东西 table owns_book (id, u_id, book_id).

现在为了测试,我总共有 26 本书,其中 25 本书是由 id 为 57 的用户添加的,1 本书是由 id 为 49 的用户添加的。 当我 运行 这个查询时:

SELECT id, title, author, category, cover, added, user_id FROM books, users 
WHERE user_id=49 AND id IN(SELECT book_id FROM owns_book) 
AND user_id IN(SELECT u_id FROM owns_book)

结果一团糟,我没有得到预期的一本书,我还得到了其他用户添加的书。 有人可以告诉我我需要的正确查询,或者我是否需要更改 table 的结构?谢谢

编辑:

users(user_id, ...) 
books(id, title, author, publisher, published, cover... ) 
owns_book(id, u_id, book_id)

您可以简化此查询并使用 LEFT JOIN...

SELECT books.id, title, author, category, cover, added, users.user_id 
    FROM users 
    LEFT JOIN owns_book on owns_book.user_id = users.user_id
    LEFT JOIN books on books.id = owns_book.id
    WHERE users.user_id=49

这将链接 user_id 并列出此 user_id 拥有的所有图书(JOIN 的 ON 位)。 WHERE 子句仅限于 user_id 您之后的列表记录。

如果在列的主列表中,有一个列在多个 table 上(如 user_id),则在其前面加上 table 名称以允许数据库检测您要使用哪一列(即使它们可能是相同的值)。

您还可以使用内部联接将 tables usersbooksowns_book table:

联接起来
SELECT id, title, author, category, cover, added, user_id 
    FROM owns_book 
    INNER JOIN users ON users.id = owns_book.u_id
    INNER JOIN books ON books.id = owns_book.book_id
    WHERE users.user_id=49

您似乎想从您的图书 table 中获取属于特定客户的所有内容。如果是这样的话,你可以试试

SELECT * FROM books 
JOIN owns_book 
ON books.id = owns_books.book_id 
WHERE owns_book.user_id = 49 

这将 select 您书中的所有道具 table 然后根据等于 book_id 的书的 ID 加入 tables的 owns_book。最后,添加参数 - 你只想看到 user_id = 49.