这些是我的表格:
category (id(PK), name (varchar))
book_category (book_id(FK PK), category_id(FK PK)
book (id(PK), name(varchar))
现在我想创建一个查询,我可以从一个类别中获取每个图书
我被困在这里,我无法弄清楚如何从多个表中获取数据,我尝试了很多 INNER JOIN ,但始终得到SQL错误
例如:
SELECT * FROM book
INNER JOIN category
ON category.id = book.id
所以我的问题是如何使用book_category
表?
答案 0 :(得分:2)
将categoryid作为FK添加到book表中。
所以你的查询就像
select b.* from book as b inner join
category as c on b.categoryid=c.categoryid
and b.categoryid=@yourValue
答案 1 :(得分:2)
你在这里有一个中间表,它允许你有多对多的关系。如果您没有第二张表,则您不能拥有一本属于同一类别的书籍,同时还可以将多个类别归属于一本书。
电子。 G。 您有第1册,第2册,第3册和第1类,第2类,第3类。
如果一本书只能属于一个类别,那么你只需要一本书中的外键链接到类别中的主键。 E.G.第1册和第2册属于第2类。 但如果第1册同时属于第2类和第3类呢?您不能只与2个主表建立这种关系,因为只有1个外键字段。 您的第二个表现在链接两个主表,因此您的book表具有中间表中book id的外键,并且category表具有中间表中类别id的外键。
现在您可以在中间表中包含这些条目。 1.第1册与第2类相关联 2.第1册与第3类相关联 3.第2册与第2类相关
将所有三个表连接在一起将告诉您书1属于第2类和第3类,第2册属于第2类。
编辑:添加一个例子来说明这一点。
书桌:
id name
1 A Best Seller
2 A Worst Seller
3 A Funny Horror
类别表:
id name
1 Horror
2 Comedy
3 Non Fiction
书籍类别表
book_id category_id
1 1
2 3
3 1
3 2
这个结构说书1属于恐怖类,书2属于非小说,书3属于恐怖和喜剧。
查询属于Horror类别的所有书籍的查询是:
select book.name from
books join book_category on book.id = book_category.book_id
where book_category.category_id = 1
这将查找中间表具有该书条目的每个书名,属于id为1的类别。
除非你真的需要加入Category表 (a)您不知道您要搜索的类别的ID(因此需要按类别名称搜索,这是不推荐的),或者 (b)您希望在查询中包含有关该类别的一些信息(例如其名称,如果您不将查询限制为单个类别,这可能很重要)
希望这有帮助。
答案 2 :(得分:2)
在表格结构中进行更改:
category : (id(PK), name (varchar))
book : (id(PK), name(varchar), categoryid(int)) // categoryid is FK of category table
然后使用查询:
SELECT b.*
FROM book AS b
INNER JOIN category AS c ON b.categoryid=c.id
答案 3 :(得分:1)
嗯,您需要使用不同的JOIN
:
SELECT b.* FROM book b
INNER JOIN book_category bc ON bc.book_id = b.id
WHERE bc.category_id = {DESIRED_VALUE}