我想做的事情必须广泛适用,但很难描述,所以我会给出我的情况的虚拟版本(假装帖子有时是共同创作的):
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
N 的 draft_count
字段的数字。但我不确定如何将整个事情作为 UPDATE 语句中的子句。我已经阅读了如何在 MySQL 中进行迭代,我想我明白了,所以如果我能让它工作,我想我可以为每个用户
做到这一点。此外,虽然我可以在 PHP 中轻松实现这一点,但我需要定期运行它,因为可能只会批量添加这些表(显然,IRL 应用程序不是博客)。再次,我已经阅读了如何创建自定义 MySQL 函数,并且我想如果我能让这个该死的更新业务正常工作的话我就可以做到,哈哈。感谢帮助!
最佳答案
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
如果您有很多行,使用临时表可能会更快。
关于MySQL:连接 HABTM 表,然后用结果计数更新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15693558/