三重连接SQL?

时间:2014-02-27 10:37:31

标签: sql

我的数据库代表一个库。每本书都标有多个内容,因此一个标题可能被标记为“科幻小说”,“短篇小说”和“俄语”。

有三个表格:bookstagsbooks_tag_link。它们看起来像这样:

图书

 ID     |     TITLE
 -----------------------------
 1      | Rendezvous With Rama
 2      | Howl and Other Poems
 3      | A Short History of Nearly Everything

代码

 ID     |     TAGNAME
 -----------------------------
 1      |     science fiction
 2      |     fiction
 3      |     poetry

Books_Tag_Link

 BOOK     |     TAG
 -----------------------------------
 1        |     1
 1        |     2
 2        |     3

希望你能看到它是如何工作的。 books_tag_link表有两个外键,并将书籍链接到标签;每本书都有很多标签,每个标签都与许多书籍相关联。我不知道这是否是最好的方式,但这就是OSS库程序Caliber所做的事情,而这正是我在学习时用作参考的方式。

现在我要做的就是说“选择所有小说书”。但我无法找到在SQL中表达这种思想的正确方法。 Select books.title where books.id = tags.id = books_tag_link.tag ......或其他什么。我不确定。

有人可以帮我解释一下我应该做什么吗?

我目前正在使用SQLite,但特定于MySQL的建议也可以。

3 个答案:

答案 0 :(得分:2)

SELECT b.title
FROM Books AS b
JOIN Books_Tag_Link AS bt ON b.id = bt.book
JOIN Tags AS t ON t.id = bt.tag
WHERE t.tagname = 'fiction'

答案 1 :(得分:1)

那样的东西?

select b.title 
from Books b join Books_Tag_Link btl on btl.BOOK=b.ID
join Tags t on t.ID=btl.TAG 
where t.TAGNAME='fiction';

警告:如果所有表都很大,则必须确保JOIN中提到的字段是键(索引)。

答案 2 :(得分:0)

您需要使用两个连接:

select
    books.title

from
    books

inner join
    books_tag_link on
        books_tag_link.book = book.id

inner join
    tags on
        tags.id = books_tag_link.tag

where
    tag.tagname = 'fiction'