2011-01-27 7 views
1

私はpostsテーブルとlikesテーブルを持っています。多くのユーザーはポストが好きです。 postsテーブルには、投稿があるlikesの番号を表す非正規化likesScore列があります。 テーブルを likesテーブル@postIdで更新したいと思います。表Bのレコード数を使用して表Aのスコア列を更新するにはどうすればよいですか?

私はそれを行う方法のアイデアを持っているが、私は、構文の権利を取得することはできません。

UPDATE posts 
SET likesScore = ... 
WHERE posts.id = @postId 

答えて

2

MySQL UPDATE statements support JOINsを - 使用:

UPDATE POSTS p 
     JOIN (SELECT t.postid, 
        COUNT(*) AS cnt 
       FROM LIKES t 
      GROUP BY t.postid) l ON l.postid = p.postid 
    SET likesscore = l.cnt 

標準手段がにありますサブクエリを使用しますが、サブクエリで相関関係が必要です WHERE句のフィルタリング - それ以外の場合は、参照を持たないレコードを更新するリスクがありますテーブルをサポートしています。

私は、この場合にLIKEが行われるたびにカウントがデータと同期しなくなる危険性が高いため、ビューを使用してカウントをテーブルに格納したくないと思います。

+0

@OMGポニー、多くのありがとう。サブクエリで "グループ化"を使用するかどうか尋ねることはできますか?私は "どこでpostId = @ postId"を使うことはできませんか?また、あなたはジョインを使用していると言っていますが、そのクエリでジョイン、または少なくともキーワード "join"を見ることはできません...何かが欠けていますか? – Mohamad

+0

カンマ区切りのテーブルリストを使用する代わりに、サブクエリにJOINすると思うと思います。 – TehShrike

+0

@TehShrike:Doh! Coffee(tm)の前に修正されました。 –

1
UPDATE posts 
SET likesScore = (SELECT count(*) FROM likes WHERE likes.id=posts.id) 
WHERE ... 
関連する問題