我的数据库代表一个库。每本书都标有多个内容,因此一个标题可能被标记为“科幻小说”,“短篇小说”和“俄语”。
有三个表格:books
,tags
和books_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的建议也可以。
答案 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'