MySQL:通过迭代并与另一行连接来更新表中的行
我有一张桌子MySQL:通过迭代并与另一行连接来更新表中的行,mysql,sql,sql-update,aggregate-functions,Mysql,Sql,Sql Update,Aggregate Functions,我有一张桌子 CREATE TABLE `papers` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(1000) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL, `my_count` int(11) NOT NULL, PRIMARY KEY (`id`), FULLTEXT KEY `title_fulltext` (`title`), )
CREATE TABLE `papers` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(1000) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
`my_count` int(11) NOT NULL,
PRIMARY KEY (`id`),
FULLTEXT KEY `title_fulltext` (`title`),
) ENGINE=MyISAM AUTO_INCREMENT=1617432 DEFAULT CHARSET=utf8 COLLATE=utf8_bin
和另一个表链接
CREATE TABLE `auth2paper2loc` (
`auth_id` int(11) NOT NULL,
`paper_id` int(11) NOT NULL,
`loc_id` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
上表中的id papers.id与第二个表中的link_table.paper_id相同。我希望遍历上表中的每一行,计算它的id在第二个表中出现的次数,并将“count”存储到上表的“my_count”列中
示例:如果tid=1=纸张id的纸张在表格链接表格中出现5次,则我的计数=5
我可以通过Python脚本来实现这一点,但它会导致太多的查询,而且我有数百万个入口,所以速度非常慢。我无法找出正确的语法来在MySQL中实现这一点
这就是我在Python的for循环中迭代的内容(太慢):
有人能告诉我怎么做这个吗?必须有一种方法将其嵌套并直接放入MySQL中,这样它会更快,不是吗?这对您有什么影响
update papers a
set my_count = (select count(*)
from auth2paper2loc b
where b.paper_id = a.id);
使用以下任一选项:
UPDATE PAPERS
SET my_count = (SELECT COUNT(b.paper_id)
FROM AUTH2PAPERLOC b
WHERE b.paper_id = PAPERS.id)
…或:
UPDATE PAPERS
LEFT JOIN (SELECT b.paper_id,
COUNT(b.paper_id) AS numCount
FROM AUTH2PAPERLOC b
GROUP BY b.paper_id) x ON x.paper_id = PAPERS.id
SET my_count = COALESCE(x.numCount, 0)
当AUTH2PAPERLOC表中没有PAPERS.id的任何实例时,
COALESCE
必须将NULL转换为零。Count()
当AUTH2PAPERLOC表中没有找到PAPERS.id
的实例时返回0。@Ronnis/确切地说,在第一次查询中不需要它。在第二种情况下(通常更快),是的,但是有一个语法error@Richard是的。当我再次阅读他的回答时,我意识到这个评论是针对第二个问题的。
update papers left join
(select paper_id, count(*) total from auth2paper2loc group by paper_id) X
on papers.id = X.paper_id
set papers.my_count = IFNULL(X.total, 0)
update papers left join
(select paper_id, count(*) total from auth2paper2loc group by paper_id) X
on papers.id = X.paper_id
set papers.my_count = IFNULL(X.total, 0)