1

タグを整理するためのテーブルがあります..

記事と記事タグの 3 つのテーブル:

article_tags
---
tag_id *
tag_name

articles
---
article_id *
article_name 

individual_article_tags
----
article_id *
tag_id *

AND 画像と画像タグ用の 3 つの個別のテーブル

image_tags
---
tag_id *
tag_name

images
---
image_id *
image_name 

individual_image_tags
----
image_id *
tag_id *

記事と画像のテーブルが、次のように 2 つのタグ テーブルではなく 1 つのタグ テーブルのみを参照するようにします。

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 *

問題は、タグの ID が異なり、それらをマージする方法がわからないことです..

4

1 に答える 1

2

最初tags_unifiedINSERT INTO ...SELECTUNION. 結果は、両方のテーブルからのすべてのタグの個別のセットになります。

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

次にUPDATE、新しい ID を取得するクエリを使用しindividual_image_tagsますinidividual_article_tagsJOIN

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て結果を確認します。

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 JOINandWHERE句は実際には必要ありません。これは、 がテーブル内の既存のすべてのタグに一致する必要があるためです。tags_unified

コメント後の更新:

一意の制約や複合キーを削除して再度追加するよりも、一時テーブルを作成してそこから元のリンク テーブルを再設定する方が簡単な場合があります。を使用しCREATE TEMPORARY TABLE AS SELECT...ます。次に、元のテーブルからすべての行を削除INSERT INTO ... SELECTし、一時テーブルから再入力するために使用します。

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
于 2013-01-26T23:05:12.697 に答える