参考我几年前写的文章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)
最终,你会对两件事感兴趣。
- 如何从一个特定标签获取帖子?
- 如何获取特定帖子的所有标签?
回答上述问题:
特定标签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 Server 5.x。这个概念可以应用于 Oracle、Microsoft SQL Server、IBM DB2 等。甚至我们可以将其应用于 MS Access。只是查询的语法在每个数据库中有所不同。