MySQL:连接 HABTM 表,然后用结果计数更新列

标签 mysql join iteration has-and-belongs-to-many

我想做的事情必须广泛适用,但很难描述,所以我会给出我的情况的虚拟版本(假装帖子有时是共同创作的):

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 Ndraft_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/

相关文章:

mysql - 使用 SQL 获取每个房间的最新帖子

Excel 宏 : iterate through workbooks and print individual sheets from each

javascript - 从 javascript hashmap 迭代键为最后一个元素提供空字符串

python - 你如何为 Flask 安装 MySQL?

php - 如何在php mysql中减去两个表

mysql - 如何在 UPDATE 语句中使用 JOIN?

c# - 为什么这不会产生幸运数字?

javascript - AJAX 成功无法将数据填充到表格 HTML

php - 如何为 php mysql 驱动的数据库生成下一个 ID 号

mysql - 如何通过在mysql中过滤另一个表来列出表中的所有项目