MySQL更新表是另一个表中SELECT的结果

时间:2020-01-01 17:14:29

标签: mysql wordpress

我正在尝试更新WordPress的头像。我有一张桌子wp_commentmeta,上面有一些破损的meta_value

我需要根据wp_comment表的comment_author_email重新计算值。

此查询为我提供了一个表,其中包含注释ID和新的URL

SELECT 
   comment_id, 
   CONCAT("https://www.gravatar.com/avatar/", MD5(comment_author_email)) AS url
   FROM `wp_comments` 
   WHERE comment_id IN
      (SELECT 
         comment_id FROM `wp_commentmeta` 
         WHERE `meta_key` LIKE 'avatar' 
         AND `meta_value` LIKE 'invalid')
| comment_id | url                                   |
|------------|---------------------------------------|
| 1234       | https://www.gravatar.com/avatar/ff... |
| 5678       | https://www.gravatar.com/avatar/ab... |
| ....       |  ...                                  |

但是如何基于此更新wp_commentmeta

思考我想遍历结果并运行:

UPDATE `wp_commentmeta`
   SET `meta_value` = url
   WHERE `comment_id` = comment_id
   AND `meta_key` LIKE 'avatar' 
   AND `meta_value` LIKE 'invalid'

但是如何在单个查询中做到这一点?这是我可以使用JOIN的地方吗?

1 个答案:

答案 0 :(得分:0)

这是一个示例,可以使您朝正确的方向前进。我尚未对其进行测试,因此建议您启动事务,然后在提交前检查它是否做对了。

START TRANSACTION;

UPDATE wp_commentmeta AS m
JOIN wp_comments AS c USING (comment_id)
SET m.meta_value = CONCAT("https://www.gravatar.com/avatar/", MD5(c.comment_author_email))
WHERE m.meta_key = 'avatar' AND m.meta_value = 'invalid';

...run some SELECT to double-check that it did what you want...

COMMIT;