2014-02-27 85 views
0

我的数据库表示一个库。每本书都有多个标签,这样一个标题可能被标记为“科幻小说”,“短篇小说”和“俄罗斯”。三重连接SQL?

有三个表格:books,tagsbooks_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表有两个外键,并将书籍链接到标签;每本书都有很多标签,每个标签都与很多书有关。我不知道这是否是做这件事的方式,但这是Caliber所做的OSS库程序,这就是我在学习时用作参考的一种方式。

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

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

我现在正在使用SQLite,但MySQL的具体建议也没关系。

+0

您必须连接与连接表。 – Preprocezzor

回答

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

这样的事情?

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中提到的字段是键(索引)。

+0

你的第一次加入是错误的。书籍和标签之间没有直接的关系。 – Barmar

+0

啊,对。固定 – Ashalynd

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'