Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:通过迭代并与另一行连接来更新表中的行_Mysql_Sql_Sql Update_Aggregate Functions - Fatal编程技术网

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)