2017-07-31 54 views
-1

我在我的数据库中遇到问题。例如,如果我正在构建博客,我博客上的帖子应该有多个标签。我想我的帖子表中有tag_id列,与我的tags表中的tag_id对应,但这意味着每个帖子只能有一个标签。我希望每个帖子都能够拥有多个标签。如何在单行中输入我的tag_id列中的多个ID(对应于特定帖子)。如果它不适用于ID,它可以使用标签名称吗?我意识到我可以输入多个标签名称,但是如何将标签名称与tags表中的tags_names连接?单个列中的单个行中有多个条目postgres

+0

您可以在此获得所有答案:[**通过JOINS使用MySQL数据库实现基于标记的邮件系统**](https://blog.praveen.science/implementation-for-tag-based-mail-system- by-joins-using-mysql-database /) - 这是我几年前写的一篇文章! –

回答

1

参照我几年前写的文章Implementation for tag based mail system by JOINS using MySQL Database,我会说你所做的是对的。所以,最后,你的表应该是这样的:

帖子

mysql> SELECT * FROM `mailserver`.`mails`; 
+----+------------------+----------------------------------------------+ 
| ID | Subject   | Content          | 
+----+------------------+----------------------------------------------+ 
| 1 | Welcome Home  | Hey man, Welcome to your new house.   | 
| 2 | Hi    | Hey there, wanna see what you doing at home! | 
| 3 | Your promotion | This is to say about your promotion!   | 
| 4 | What the hell? | College is really bad!      | 
| 5 | My Project Work! | I have hereby attached my project work!  | 
+----+------------------+----------------------------------------------+ 
5 rows in set (0.00 sec) 

标签:

mysql> SELECT * FROM `mailserver`.`maillabel`; 
+----+-----------+--------+ 
| ID | LabelName | MailID | 
+----+-----------+--------+ 
| 1 | inbox  |  1 | 
| 2 | inbox  |  3 | 
| 3 | inbox  |  5 | 
| 4 | personal |  1 | 
| 5 | friends |  2 | 
| 6 | office |  3 | 
| 7 | personal |  4 | 
| 8 | college |  5 | 
+----+-----------+--------+ 
8 rows in set (0.02 sec) 

关系表

mysql> SELECT * FROM `mailserver`.`maillabel`; 
+----+-----------+--------+ 
| ID | LabelName | MailID | 
+----+-----------+--------+ 
| 1 | inbox  |  1 | 
| 2 | inbox  |  3 | 
| 3 | inbox  |  5 | 
| 4 | personal |  1 | 
| 5 | friends |  2 | 
| 6 | office |  3 | 
| 7 | personal |  4 | 
| 8 | college |  5 | 
+----+-----------+--------+ 
8 rows in set (0.02 sec) 

最终,你会对两件事情感兴趣。

  1. 如何从一个特定的标签获取帖子?
  2. 如何获得一个特定帖子的所有标签?

为了回答上述疑问:

所有帖子特定标签,inbox

mysql> SELECT * 
     FROM `mailserver`.`mails` 
       JOIN `mailserver`.`maillabel` 
       ON `mailserver`.`mails`.`id` = `mailserver`.`maillabel`.`mailid` 
     WHERE `mailserver`.`maillabel`.`labelname` = 'inbox'; 
+----+------------------+-----------------------------------------+----+-----------+--------+ 
| ID | Subject   | Content         | ID | LabelName | MailID | 
+----+------------------+-----------------------------------------+----+-----------+--------+ 
| 1 | Welcome Home  | Hey man, Welcome to your new house.  | 1 | inbox  |  1 | 
| 3 | Your promotion | This is to say about your promotion! | 2 | inbox  |  3 | 
| 5 | My Project Work! | I have hereby attached my project work! | 3 | inbox  |  5 | 
+----+------------------+-----------------------------------------+----+-----------+--------+ 
3 rows in set (0.00 sec) 

并回答第二个问题...

获取一个特定帖子的标签:

mysql> SELECT labelname 
     FROM `mailserver`.`maillabel` 
       JOIN `mailserver`.`mails` 
       ON `mailserver`.`mails`.`id` = `mailserver`.`maillabel`.`mailid` 
     WHERE `mailserver`.`mails`.`id` = 3; 
+-----------+ 
| labelname | 
+-----------+ 
| inbox  | 
| office | 
+-----------+ 
2 rows in set (0.00 sec) 

该实现适用于MySQL服务器5.x。这个概念可以应用于Oracle,Microsoft SQL Server,IBM DB2等。即使我们可以将其应用于MS Access。只是查询的语法在每个数据库中都不相同。

+0

在我的''tags'''表中添加一个非唯一的'''''''''''应该算出来!非常感谢!!! –

+0

@ParthPatel你介意通过点击勾号按钮来接受我的答案吗?今后,如果你不接受任何答案,只是提出问题,你就有可能会质疑禁令,这将使你根本不会在本网站上提问! ':(' –

+1

@ParthPatel由于答案对你有帮助,你应该通过点击Tick按钮来接受答案,这对未来的读者也会有所帮助 –

相关问题