2016-09-05 9 views
-2

次の問題があります。 私は、データベーステーブルに格納された一連の投稿を持っていました。各ユーザは、データベースに既に存在するタグで自分の投稿にタグを付けることも、新しいタグを作成することもできます。 関連IDから最小IDを持つIDを関連テーブルから設定します

私はテーブルを持っている:

postテーブル:

id content 
1 test1 

tagsテーブル

id name 
1 tag1 
2 tag1 
3 tag2 
4 tag2 

post_tagsテーブル

post_id tag_id 
1  2 
1  4 
(非常に小さなサブセットは、現実には約20000レコードを持っています)

ユーザーが気づいていなかったバグのために、ユーザーが投稿を編集するたびに、タグテーブルに既にあるタグを再利用する代わりに、新しいタグが作成されて投稿に関連付けられましたタグテーブル内のnameフィールドが一意であると設定されていた場合にエラーを早期に発見した可能性がありますが、一意であるとはいえ、そうではありませんでした。

作成した重複タグをすべて削除する予定ですが、最初にその名前で作成された最初のタグに投稿を再関連付けする必要があります(IDは自動的にインクリメントされるため、数字は古い創作を意味する)。

私は、次のクエリを試してみました:

UPDATE post_tags 
SET tag_id=(
    SELECT min_id FROM (
     SELECT min(id) as min_id, name 
     FROM tags t 
     WHERE t.name=(
      SELECT name 
      FROM tags t2 
      WHERE t2.id=tag_id 
     ) GROUP BY name 
    ) as `inner` 
); 

は、しかし、これはメッセージUnknown column 'tag_id' in 'where clause'で失敗しています。通常、私は内部WHERE節のtag_idが更新前(UPDATE table SET value = value + 1と同じ方法)のtag_idを参照することを期待していますが、この場合は動作していないようです。

私の期待される結果は以下のように見えるようにpost_tags表を作ることだった。

post_id tag_id 
1  1 
1  3 

tag_idフィールドは前と同じ名前のタグを参照してください。これは(実際には)前のデータに相当します。これを最初のステップとして行う必要があります。重複するタグ名を削除し、名前列をユニークに設定して、これが再び起こらないようにします。

例SQLスキーマのフィドル:http://sqlfiddle.com/#!9/1ff0b8 (エラーのために更新プログラムを追加できません)。

私は間違っていますか?

+1

で、それは生きて働いて見ます問題を再現しやすくするために、適切なCREATE文とINSERT文(および/またはsqlfiddle)を提供してください。 2。まだ実行していない場合は、手順1で提供された情報に対応する望ましい結果セットを提供してください。 – Strawberry

+0

こんにちは@Strawberryご意見ありがとうございます。私は質問をもっと明確にしようとしました。うまくいけば私は成功しましたが、もしそうでなければ私に知らせてください。 – apokryfos

+0

上記のデータセットと、フィドルで提供されるデータセットは異なります。したがって、望ましい結果がどうあるべきかははっきりしない。 – Strawberry

答えて

1

これは動作します:あなたがまだの場合は1:あなたが好きなら

UPDATE post_tags pt 
JOIN tags t ON pt.tag_id = t.id 
JOIN (
    SELECT name, min(id) AS min_id 
    FROM tags 
    GROUP BY name 
) p ON t.name = p.name 
SET pt.tag_id = p.min_id; 
  • は、アクションのこの単純な二段階のコースを、次の考慮、sqlfiddle
関連する問題