获取具有多个子表的条目

时间:2011-12-31 01:38:45

标签: php mysql

我有一个数据库,我无法弄清楚如何获取图书数据。我将解释我之前是如何做到的以及我现在打算如何做到这一点。

为了简单起见,我将采用“书籍”的例子,因为它最容易显示这种关系。之前,我有这个结构,我发现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时,我该怎么做呢?我怎么做才能返回作者姓名和流派名称?子查询?一个单独的查询?或者实际上是否存在我不知道的单线查询?

1 个答案:

答案 0 :(得分:4)

你需要使用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;