我有桌上的文件
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=paper_id的纸张在table link_表中出现5次,则my_count=5。
我可以通过一个Python脚本来实现,但是它会导致太多的查询,而且我有数百万个入口,所以它非常慢。我无法在MySQL中找到正确的语法。
这就是我在Python的for循环中迭代的内容(太慢):
SELECT count(link_table.auth_id) FROM link_table
WHERE link_table.paper_id = %s
UPDATE papers SET auth_count = %s WHERE id = %s
有人能告诉我怎么做这个吗?一定有一种方法可以将其嵌套并直接放在MySQL中,这样速度会更快,不是吗?
最佳答案
使用以下任一选项:
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
必须将空值转换为零。关于mysql - MySQL:通过迭代并与另一个连接来更新表中的行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5532050/