三重连接与SQL?

三重连接与SQL?,sql,Sql,我的数据库代表一个库。每本书都有多个标签,因此一个标题可能会被标记为“科幻小说”、“短篇小说”和“俄语” 共有三个表:图书、标签、以及图书标签链接。它们看起来像这样: 书籍 ID | TITLE ----------------------------- 1 | Rendezvous With Rama 2 | Howl and Other Poems 3 | A Short History of Nearly Everything I

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

共有三个表:
图书
标签
、以及
图书标签链接
。它们看起来像这样:

书籍

 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
标签

 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
书籍\u标签\u链接

 BOOK     |     TAG
 -----------------------------------
 1        |     1
 1        |     2
 2        |     3
希望你能明白这是怎么回事。图书标签链接表有两个外键,将图书链接到标签;每本书都有许多标签,每个标签都与许多书相关联。我不知道这是否是最好的方法,但这就是OSS库程序Calibre所做的,这就是我在学习时用作参考的

现在我要做的是说“选择所有小说”。但我无法找到用SQL表达这种想法的正确方法<代码>选择books.title,其中books.id=tags.id=books\u tag\u link.tag。。。或者别的什么。我不确定

有人能帮我做点什么吗

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

类似的建议

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

类似的内容

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

类似的内容

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

类似的内容

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';

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

需要使用两个联接:

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'

您需要使用两个联接:

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'

您需要使用两个联接:

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'

您需要使用两个联接:

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'

必须用联接连接表。必须用联接连接表。必须用联接连接表。必须用联接连接表。必须用联接连接表。第一次联接错误。书籍和标签之间没有直接关系。你的第一次加入是错误的。书籍和标签之间没有直接关系。你的第一次加入是错误的。书籍和标签之间没有直接关系。你的第一次加入是错误的。书籍和标签之间没有直接关系。