次の問題があります。 私は、データベーステーブルに格納された一連の投稿を持っていました。各ユーザは、データベースに既に存在するタグで自分の投稿にタグを付けることも、新しいタグを作成することもできます。 関連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 (エラーのために更新プログラムを追加できません)。
私は間違っていますか?
で、それは生きて働いて見ます問題を再現しやすくするために、適切なCREATE文とINSERT文(および/またはsqlfiddle)を提供してください。 2。まだ実行していない場合は、手順1で提供された情報に対応する望ましい結果セットを提供してください。 – Strawberry
こんにちは@Strawberryご意見ありがとうございます。私は質問をもっと明確にしようとしました。うまくいけば私は成功しましたが、もしそうでなければ私に知らせてください。 – apokryfos
上記のデータセットと、フィドルで提供されるデータセットは異なります。したがって、望ましい結果がどうあるべきかははっきりしない。 – Strawberry