MySQL UPDATE使用目标表

时间:2015-02-21 12:53:09

标签: php mysql

我正在尝试根据同一个表中的值更新表中的所有总计。

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或其他值的情况下在整个表上更新此查询?

目前不要担心性能只需要相对简单的工作。

2 个答案:

答案 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的评论得到了正确的查询。

但有一些重要的变化:

  1. 它应该在posts.id = p.post_id,而不是相反
  2. 应该LEFT JOIN来计算0值。
  3. 需要IFNULL(p.cnt, 0)以避免警告并填写默认值。
  4. 虽然我不确定表现,但它的功效却像魅力一样。

    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);