2011-12-31 52 views
0

我有一個數據庫,我無法弄清楚如何獲取圖書數據。我會解釋我之前是如何做到的,以及我現在計劃如何做到這一點。獲取多個子表的條目

爲了簡單起見,我將採用「書籍」示例,因爲它是最容易展現關係的示例。之前,我有這個結構,我發現沉重的DB:

Books: 
book_id 
title 
author_name 
genre_name 

很容易按流派查詢個人的書籍,所有書籍,書籍作者和書籍。這裏的問題是我需要獲取作者或流派的列表。我必須選擇ALL書籍,在將它們交給瀏覽器之前檢測可能的重複,相同,唯一性等。我已經感覺到處理的滯後。

所以我現在要做的是這樣的:我有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時,我該如何做?我如何做它返回作者姓名和流派名稱?子查詢?一個單獨的查詢?或者實際上是否存在我不知道的單行查詢?

回答

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; 
+0

已經完成了區別,但它仍然是處理所有書籍以獲得不同作者列表的拖拽。 – Joseph 2011-12-31 01:49:43

+0

@fskreuz酷:-)只是給你的選擇,如果你不知道 – 2011-12-31 01:52:59