【问题标题】:Fetching an entry with multiple child tables获取具有多个子表的条目
【发布时间】:2011-12-31 01:38:45
【问题描述】:

我有一个数据库,我不知道如何获取图书数据。我将解释我以前是怎么做的以及我现在打算怎么做。

为简单起见,我将采用“书籍”示例,因为它最容易显示这种关系。以前,我有这种结构,我发现它在 DB 上很重:

Books:
book_id
title 
author_name
genre_name

很容易查询单个书籍、所有书籍、作者书籍和流派书籍。这里的问题是当我需要获取作者或流派列表时。在将它们交给浏览器之前,我必须选择所有书籍,检测可能的重复、相同、唯一等。我已经感觉到处理的滞后了。

所以我现在打算做的是:我有 3 张桌子,一张用于书籍,另一张用于作者,另一张用于流派。

Books:       Authors:      Genre: 
book_id      author_id     genre_id
title        author_name   genre_name
author_id
genre_id

这样,我可以通过author_idgenre_id 标记书籍,并且可以更轻松地更快地获取所有作者和流派,而不会影响“按作者获取”和“按流派获取”。此外,我可以通过更改 author_idgenre_id 轻松更改书籍作者和/或类型。

但是如果我选择一本书,当普通的select * from Books where book_id=something 只返回流派和作者的 ID 时,我该怎么做?如何返回作者姓名和流派名称?子查询?一个单独的查询?还是实际上有一个我不知道的单行查询?

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    您需要使用 INNER JOIN 才能执行此类操作

    SELECT b.book_id, b.title, a.author_name, g.genre_name FROM Books 
    INNER JOIN Authors a ON b.author_id=a.author_id 
    INNER JOIN Genre g ON b.genre_id=g.genre_id
    WHERE book_id=12
    

    如果您不想创建单独的表(顺便说一句,这是一个很好的设计),您可以使用 DISTINCT 查询作为替代方法

     SELECT DISTINCT author_name FROM Books;
    

    【讨论】:

    • 已经完成了不同的工作,但为了获得不同的作者列表而处理所有书籍仍然很麻烦。
    • @fskreuz Cool :-) 只是给你一个选项,以防你不知道
    猜你喜欢
    • 2018-07-15
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多