JOIN如何工作,我如何正确使用它,我甚至需要它吗?

时间:2016-02-02 10:41:57

标签: mysql join

这些是我的表格:

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表?

4 个答案:

答案 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}