批量更新MySQL表,其中包含从另一个表连接的数据

时间:2017-01-17 03:41:35

标签: mysql join sql-update trim concat

这不是WordPress的具体内容,但值得注意的是,它是我正在使用的WP数据库...

我需要为posts的所有条目更新post_title表值post_type='appearance'。当前post_title以所需名称开头,但结尾为"外观[some#]"。所以,来自"外观"最后需要删除,并且需要使用表meta_value中的postmeta替换meta_key = _place_id,其中post_idID等于posts 102表。

例如:有一个ID为postmeta的帖子标题为" John Doe外观102"。在meta_key = _place_id表中,post_id = 102meta_value = 108post_title = John Doe 108。因此,最终结果将是UPDATE posts SET post_title = TRIM(TRAILING ' appearance %' FROM post_title) WHERE post_type='appearance'

这比我复杂,但我想联接是必要的。我认为两个单独的查询是有意义的。所以,类似于:

UPDATE posts

left join postmeta on
    posts.ID= postmeta.post_id
set
    posts.post_title = CONCAT(posts.post_title, " ", postmeta.meta_value WHERE postmeta.meta_key = '_place_id')

{{1}}

1 个答案:

答案 0 :(得分:1)

您可以使用SUBSTRING_INDEX()

在单个查询中执行此操作
UPDATE posts p
LEFT JOIN postmeta pm
    ON p.ID = pm.post_id
SET p.post_title = CONCAT(SUBSTRING_INDEX(p.post_title, 'appearance', 1), pm.meta_value)
WHERE pm.meta_key = '_place_id'

SUBSTRING_INDEX('John Doe appearance 102', 'appearance', 1)出现之前,appearance将返回之前的所有内容<{1}},即John Doe(末尾有空格)。然后,我们可以简单地连接meta_value