单列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)
最终,您会对两件事感兴趣。
- 如何从一个特定的标签中获取 posts?
- 如何获取一个特定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。只是每个数据库的查询语法不同。
我的数据库中的 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)
最终,您会对两件事感兴趣。
- 如何从一个特定的标签中获取 posts?
- 如何获取一个特定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。只是每个数据库的查询语法不同。