我正在尝试根据同一个表中的值更新表中的所有总计。
UPDATE posts AS p SET posts.answers_total = (
SELECT COUNT(posts.id)
FROM posts
WHERE posts.post_id = p.id
)
我收到以下错误:
Error Code: 1093
You can't specify target table 'p' for update in FROM clause
似乎是一个常见的问题,但我无法将一个执行此操作的查询拼凑在一起。我看过许多带有INNER JOIN
和其他子查询的示例,但他们都假设我们知道id
或其他一些值。
如果我使用比原始p
表更多的查询来包装它,则会丢失。无论如何在不知道任何id或其他值的情况下在整个表上更新此查询?
目前不要担心性能只需要相对简单的工作。
答案 0 :(得分:4)
您可以使用JOIN重写更新查询:
UPDATE
posts INNER JOIN (
SELECT id, COUNT(*) cnt
FROM posts
GROUP BY id
) p ON posts.post_id = p.id
SET
posts.answers_total = p.cnt
答案 1 :(得分:2)
好的,我终于根据@fthiella的答案和@ gordon-linoff的评论得到了正确的查询。
但有一些重要的变化:
posts.id = p.post_id
,而不是相反LEFT JOIN
来计算0
值。IFNULL(p.cnt, 0)
以避免警告并填写默认值。虽然我不确定表现,但它的功效却像魅力一样。
UPDATE posts
LEFT JOIN (
SELECT post_id, COUNT(*) cnt
FROM posts
WHERE STATUS = 'active' AND post_id <> 0
GROUP BY post_id
) p ON posts.id = p.post_id
SET posts.answers_total = IFNULL(p.cnt, 0);