代码之家  ›  专栏  ›  技术社区  ›  green_03

SQL-返回用户拥有的书籍

  •  0
  • green_03  · 技术社区  · 7 年前

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

    为此,我认为我需要记录的用户id,我将其存储在会话PHP变量中,用户id位于表users中。 有关书籍的信息存储在books表中,它有自己的id主键。 然后,为了显示谁拥有我拥有的内容,表ownes\u book(id,u\u id,book\u 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)
    

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

    编辑:

    users(user_id, ...) 
    books(id, title, author, publisher, published, cover... ) 
    owns_book(id, u_id, book_id)
    
    3 回复  |  直到 7 年前
        1
  •  2
  •   Kris Ariganello    7 年前

    看起来您希望从books表中获取特定客户拥有的所有内容。如果是这样的话,你可以试试

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

    这将从books表中选择所有道具,然后根据book的ID等于owns\u book的book\u ID连接这些表。最后,添加参数-您只想看到user\u id=49。

        2
  •  1
  •   Nigel Ren    7 年前

    您可以简化此查询并使用左联接。。。

    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\u id并列出此user\u id(连接的ON位)拥有的任何书籍。WHERE子句仅限于列出用户id之后的记录。

    如果在主列列表中,多个表上有一列(如user\u id),则在该列前面加上表名,以允许数据库检测要使用的列(即使它们可能是相同的值)。

        3
  •  0
  •   eol    7 年前

    还可以使用内部联接来联接表 users books 使用 owns_book 表格:

    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