首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MYSQL将标签表合并为一个

问MYSQL将标签表合并为一个
EN

Stack Overflow用户
提问于 2013-01-27 06:55:57
回答 1查看 105关注 0票数 1

我有表格来组织标签..

3篇文章和文章标签的表格:

代码语言:javascript
复制
article_tags
---
tag_id *
tag_name

articles
---
article_id *
article_name 

individual_article_tags
----
article_id *
tag_id *

和3个单独的表,用于图像和图像标签

代码语言:javascript
复制
image_tags
---
tag_id *
tag_name

images
---
image_id *
image_name 

individual_image_tags
----
image_id *
tag_id *

我希望文章和图像表只引用1个标签表,而不是2个标签表,如下所示:

代码语言:javascript
复制
tags
---
tag_id *
tag_name

articles
---
article_id *
article_name 

individual_article_tags
----
article_id *
tag_id *

images
---
image_id *
image_name 

individual_image_tags
----
image_id *
tag_id *

问题是标签有不同的is,我不知道如何合并它们。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-27 07:05:13

首先,通过对tags_unified执行INSERT INTO ...SELECT,创建一个具有自己的auto_increment id (与其他现有表不同)的新UNION表。结果将是两个表中所有标签的不同集合。

代码语言:javascript
复制
CREATE TABLE tags_unified (
  tags_id INT PRIMARY KEY AUTO_INCREMENT,
  tag_name VARCHAR(64)
);

/* Load up all the tags with new ids */
INSERT INTO tags_unified (tag_name)
  SELECT tag_name FROM article_tags
  UNION
  SELECT tag_name FROM image_tags

然后使用JOIN查询UPDATE所有的individual_image_tags和inidividual_article_tags,以获得新的ids。

代码语言:javascript
复制
UPDATE
  individual_image_tags
  JOIN image_tags ON individual_image_tags.tag_id = image_tags.tag_id
  /* LEFT JOIN the old tags to the new tags by tag_name */
  LEFT JOIN tags_unified ON image_tags.tag_name = tags_unified.tag_name
SET individual_image_tags.tag_id = tags_unified.tag_id
/* And update those which have a match in the new tags table */
WHERE tags_unified.tag_id IS NOT NULL

UPDATE
  individual_article_tags
  JOIN article_tags ON individual_article_tags.tag_id = article_tags.tag_id
  LEFT JOIN tags_unified ON article_tags.tag_name = tags_unified.tag_name
SET individual_article_tags.tag_id = tags_unified.tag_id
WHERE tags_unified.tag_id IS NOT NULL

在运行UPDATE语句之前,请将其重新格式化为SELECT语句以验证结果。

代码语言:javascript
复制
SELECT
  individual_image_tags.*, 
  tags_unified.*
FROM
  individual_image_tags
  JOIN image_tags ON individual_image_tags.tag_id = image_tags.tag_id
  LEFT JOIN tags_unified ON image_tags.tag_name = tags_unified.tag_name
WHERE tags_unified.tag_id IS NOT NULL

SELECT
 individual_article_tags.*, 
 tags_unified.*
FROM
  individual_article_tags
  JOIN article_tags ON individual_article_tags.tag_id = article_tags.tag_id
  LEFT JOIN tags_unified ON article_tags.tag_name = tags_unified.tag_name
WHERE tags_unified.tag_id IS NOT NULL

编辑:

LEFT JOIN和WHERE子句实际上不应该是必需的,因为对于tags_unified表中的每个现有标记,都应该与之匹配。

评论后更新:

创建临时表并根据这些表重新填充原始链接表可能比删除并重新添加唯一约束或组合键更容易。使用CREATE TEMPORARY TABLE AS SELECT...。然后删除原始表中的所有行,并使用INSERT INTO ... SELECT从临时表中重新填充它。

代码语言:javascript
复制
CREATE TEMPORARY TABLE temp_individual_article_tags AS
    SELECT
     individual_article_tags.article_id 
     tags_unified.tag_id
    FROM
      individual_article_tags
      JOIN article_tags ON individual_article_tags.tag_id = article_tags.tag_id
      LEFT JOIN tags_unified ON article_tags.tag_name = tags_unified.tag_name
    WHERE tags_unified.tag_id IS NOT NULL
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14542433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档