我有桌上的文件

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/

10-11 22:39
查看更多