【问题标题】:How do I insert values into a many:many relation table for posts and tags?如何将值插入到帖子和标签的多:多关系表中?
【发布时间】:2021-09-29 13:12:15
【问题描述】:

我想在我的帖子上有多个不同的标签,以便以后过滤它们。我认为最好的方法是拥有下一张桌子:

POSTS:
+----+-------------+
| ID | Other stuff |
+----+-------------+
| *  | *           |
+----+-------------+

TAGS:
+----+------+
| ID | TAGS |
+----+------+
| *  | *    |
+----+------+

AND TAG_POSTS:
+---------+--------+
| POST_ID | TAG_ID |
+---------+--------+
| *       | *      |
+---------+--------+

现在我已经设置好了,所以当有人发布数据时,经过一些检查后,数据只是插入到帖子表中。

如果我理解正确,我需要检查每个标签是否已经存在一个选择,如果不存在则插入它。但是如何在 tag_post 表中输入正确的值呢?

INSERT INTO posts SET value1, value2... ; 
SELECT @@IDENTITY 

这是为了插入我的帖子而不是获取它的 ID。

这将在一个 for 循环中,并且会为每个输入的标签插入一次。

SELECT id FROM tags WHERE tag = tag; 
//if results get returned then its already in and you have the ID

INSERT INTO tags SET tag; SELECT @@IDENTITY 
//this is for inserting the tag and getting its id if it's not in

将这两个 ID 保存在一个变量中并将其插入到中间的表格中就可以了吗?

还有更简单的方法吗?对我来说,为插入调用 MySQL 10 次以上似乎有点多。我将使用 NodeJS 来执行此操作。

【问题讨论】:

  • 也许看看INSERT INTO ... VALUES (...),(...) 语法?
  • MySQL 版本??
  • 插入效果很好。我只是好奇是否有更简单的方法可以插入中间表。我在版本 10.4.19-MariaDB

标签: mysql sql


【解决方案1】:

首先你获取帖子的id:

INSERT INTO posts VALUES(...);
SET @postid = LAST_INSERT_ID();

然后你像这样创建标签:

INSERT INTO tags(tag)
SELECT tag
FROM (VALUES -- MySQL 8 syntax; for MariaDB use CTEs
  ROW('foo'),
  ROW('bar'),
  ROW('baz')
) AS todo(tag)
WHERE NOT EXISTS (
  SELECT *
  FROM tags
  WHERE tags.tag = todo.tag
);

最后你插入后标签对:

INSERT INTO posts_tags(post_id, tag_id)
SELECT @postid, id
FROM tags
WHERE tag IN ('foo', 'bar', 'baz');

您可能希望在 tags(tag)posts_tags(post_id, tag_id) 上创建唯一索引。

【讨论】:

  • 嘿,你能解释一下或链接这个语法吗?我真的无法让SELECT FROM VALUES, ROW('foo'), or SELECT FROM AS todo(tag) 工作。我只能在没有(tag) 的情况下做SELECT FROM as todo,并用联合选择每一行...
  • 这适用于 MySQL 8。对于早期,您需要联合所有来生成 3 行。在 mariadb 你需要使用 cte (dba.stackexchange.com/q/177312/12916 and stackoverflow.com/q/48511376/87015)
猜你喜欢
  • 2014-11-02
  • 2012-02-26
  • 1970-01-01
  • 2013-07-20
  • 2021-12-21
  • 2011-12-23
  • 1970-01-01
  • 2023-02-01
相关资源
最近更新 更多