Mysql:使用同一个表中的count更新表

时间:2015-07-08 08:57:14

标签: mysql

我有一张表:

`url` varchar(255) NOT NULL,
`cnturl` int(11) DEFAULT NULL,

' URL'包含一些网址。在' cnturl'我想存储表中相同网址的次数(是的,它是多余的,我出于速度原因这样做)。

所以为了更新这些值,我需要这样的东西:

UPDATE urltable 
SET cnturl=(
    SELECT COUNT(t.id) FROM urltable AS t WHERE t.url=urltable.url
 );

但这给了我错误: 您无法指定目标表' urltable'用于FROM子句中的更新

我也试过了:

UPDATE urltable 
  INNER JOIN (  
  SELECT COUNT(*) as cnt, url FROM urltable
  ) t 
  ON t.url=urltable.url 
SET urltable.cnturl = t.cnt;

但这会产生错误的结果(有些计数为NULL,而其他计数为所有记录的计数)。

我也试过了:

UPDATE urltable SET cnturl =
  (SELECT t.cnt FROM 
      (SELECT COUNT(t.id) AS cnt, url FROM urltable) t 
   WHERE t.url=urltable.url)

但这会产生相同的错误结果(某些计数为NULL,而其他计数则为所有记录的计数)。

我想它应该更像这样:

UPDATE urltable 
  INNER JOIN (  
  SELECT COUNT(*) as cnt, url FROM urltable t
  WHERE t.url=urltable.url;
  ) t 
  SET urltable.cnturl = t.cnt;

但最终会出现:未知列' urltable.url'在' where子句'。

我无法找到任何其他解决方案。还有其他想法吗?

2 个答案:

答案 0 :(得分:1)

试试这个:

UPDATE urltable 
   INNER JOIN (  
   SELECT IFNULL(COUNT(url),0) as cnt, url FROM urltable
   GROUP BY url
   ) t 
   ON t.url=urltable.url 
SET urltable.cnturl = t.cnt;

答案 1 :(得分:1)

您可以尝试此查询:

UPDATE urltable SET cnturl = 
(SELECT COUNT(*) FROM 
    (SELECT * FROM urltable) t 
WHERE t.url=urltable.url);

这里是fiddle