0

私がやりたいことは広く適用できるものでなければなりませんが、説明するのは難しいので、私の状況のダミー バージョンを示します (ふりをする投稿は時々共著です)。

Table A: Users

id  |  name  |...demographics....|  post_count | draft_count

Table B: Posts

id  |  title  |...bunch of columns...| is_draft   

一方

Table C: Users_Posts

id  | user_id  | post_id

post_countここで、 列と列が追加されたばかりだとしましょう。draft_count何千もの と がpostsありusersます。それらの列にデータを入力したい! 私はこれまで得ることができます:

SELECT count(*) FROM `people` 
    JOIN `users_posts` ON `users`.`id`=`users_posts`.`users_id`
    JOIN `posts` ON `users_posts`.`post_id`=`posts`.`id`
    WHERE `posts`.`is_draft` = 1 AND `users`.`id`= N

user これにより、 Ndraft_countフィールドを更新したい番号が得られます。UPDATEしかし、このすべてを声明の節としてどのように受け止めればよいかわかりません。MySQL で反復処理する方法を読んだことがありますが、理解できたと思います。これを機能させることができれば、それぞれに対して実行できると思いますuser。さらに、これは PHP で簡単に実現できますが、定期的に実行する必要があります。おそらく、これらのテーブルへのバッチ追加のみになるからです (IRL アプリケーションは明らかにブログではありません)。繰り返しますが、カスタムの MySQL 関数を作成する方法を読みました。この血まみれの更新ビジネスを機能させることができれば、それを行うことができると思います (笑)。助けてください!

4

1 に答える 1

1
UPDATE users
JOIN (
    SELECT COUNT(posts.id) as draft_count, users_posts.users_id
    FROM posts 
    JOIN users_posts ON users_posts.post_id = posts.id
    WHERE posts.is_draft = 1
    GROUP BY users_posts.users_id
) as draft_counts ON users.id = draft_counts.users_id
SET users.draft_count = draft_counts.draft_count

行数が多い場合は、一時テーブルを使用すると高速になる場合があります。

于 2013-03-28T23:04:18.870 に答える