单列postgres中单行中的多个条目

Multiple entries in a single row in a single column postgres

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

中的 tags_names 连接起来

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

帖子

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)  

关系Table

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. 如何从一个特定的标签中获取 posts?
  2. 如何获取一个特定post的所有标签?

回答上述问题:

所有 post 特定标签,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)  

然后回答第二个问题...

获取一个特定的标签post:

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。只是每个数据库的查询语法不同。