我有一张表:
`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子句'。
我无法找到任何其他解决方案。还有其他想法吗?
答案 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