使用JOIN的标签

时间:2010-12-16 04:42:26

标签: mysql tags implementation

好的,我遇到了这种情况。 3个表格,标签,书籍和交叉表*。你又怎么处理这个?

tags
  -id    int
  -name  varchar

books
  -id    int
  -name  varchar

taggings
  -tagId_fk   int
  -bookId_fk  int

示例数据

tags
  id   name
   1   good
   2   really good
   3   bad
   4   long
   5   exciting

books
  id      name
   1      Pumpkin Man
   2      O-castic Bastard

taggings
  bookId_fk     tagId_fk
  1             1
  1             4
  2             4
  2             5

所以南瓜人已被标记为goodlong,而 O-castic Bastard 已被标记为longexciting

我想写一个检索的查询:

books.id   books.name      taggings.tagId_fk as tags.name (know what I mean?)
1          Pumpkin Man        good
1          Pumpkin Man        long
2          O-castic Bastard   long
2          O-castic Bastard   exciting

不完全是我想要的


SELECT DISTINCT taggings.bookId_fk, tags.name FROM tags
  INNER JOIN taggings ON taggings.tagId_fk=tags.tagId
  ORDER BY taggings.bookId_fk;

我真正的问题是,甚至可以在没有:

的情况下在MySQL中显示上述结果
  • 将其分解为多个查询,
  • 根本使用子查询?

* PS我知道some people don't use an intersection table

1 个答案:

答案 0 :(得分:2)

    SELECT b.*,
           t.name
      FROM books b
INNER JOIN taggings t_b ON t_b.bookId_fk = b.id
INNER JOIN tags t ON t.id = t_b.tagId_fk
  ORDER BY b.id

所以,是的,这是可能的。

注意:如果您的图书完全没有标记 - 在两种情况下都将INNER更改为LEFT,您将获得NULL值那些书的标签。