2013-03-28 33 views
0

我想要做的事情必須廣泛適用,但很難描述,所以我會給出我的情況的虛擬版本(假裝帖子是有時合着):MySQL:加入HABTM表格,然後用結果數量更新一列

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_countdraft_count列剛剛添加 - 有成千上萬的postsusers。我想填充這些列!我可以遠遠得到這樣的:

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ňdraft_count場數。但我不確定如何將這整個事件作爲UPDATE聲明中的子句。我已經閱讀了如何在MySQL中進行迭代,我想我可以得到它,所以如果我能夠實現這一點,我認爲我可以爲每個user做到這一點。此外,雖然我可以在PHP中輕鬆實現此目的,但我需要定期運行此操作,因爲可能只會批量添加這些表(IRL應用程序顯然不是博客)。再次,我已經閱讀了如何創建自定義MySQL函數,並且我認爲如果我能夠讓這個血腥的更新業務工作,哈哈就可以做到這一點。幫助讚賞!

回答

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 

如果您有很多行,那麼使用臨時表可能會更快。

+0

完美!沒有必要迭代。你是我的英雄! – Jonline

+0

我編輯了您的答案,將「tmp.users_id」更改爲「draft_counts.user_id」;沒有這個改變,我無法做這個工作。 – Jonline

相關問題