SQL更新行基于另一行

时间:2015-02-23 23:06:46

标签: mysql wordpress

我有一个名为" wp_postmeta"

的wordpress数据库表

看起来像这样(简化)

wp_postmeta

以下是我想用英语做的事情,希望有人可以帮助我将其翻译成实际的SQL语句。

如果meta_key(地址)LIKE"%Portland%&#34 ;,则将meta_value(post_city_id)更新为7,17" post_id是相同的。

所以最后看起来像: enter image description here

我尝试了这个,但执行时没有选择任何行。

UPDATE wp_postmeta
SET wp_postmeta_bak.meta_value = "7,17"
WHERE wp_postmeta.meta_key = "post_city_id"
AND
wp_postmeta.meta_key = "address" AND wp_postmeta.meta_value LIKE "%Portland"

我在这里读到了另一个关于使用临时表的问题,但那比我的工资等级高。

2 个答案:

答案 0 :(得分:0)

你没有得到任何结果,因为你告诉代码两个不同的专属:

1)其中meta_key =" post_city_id"和

2)其中同一列="地址"。

从我所看到的,它是一个或另一个。你不能兼得。这可能是一个错字。

 WHERE wp_postmeta.meta_key = "post_city_id"
 AND
 wp_postmeta.meta_key = "address" 

 AND wp_postmeta.meta_value LIKE "%Portland"

答案 1 :(得分:0)

啊,这个神秘而精彩的wp_postmeta钥匙/超值商店播出了更多的神秘和奇迹。您需要一个自联接来关联与相同post_id值相关的postmeta行。

您需要更新自联接表格的右侧。

  UPDATE wp_postmeta a
    JOIN wp_postmeta b  ON a.post_id = b.post_id
                       AND b.meta_key = 'address'
                       AND b.meta_value LIKE '%Portland%'
     SET a.meta_value = '7,17'
   WHERE a.meta_key = 'post_city_id'

除非所有三个ON条件匹配,否则JOIN将产生一个空结果集。一旦它产生非空结果集,它将更新正确的行。

在执行此更新之前,您可以测试它是否使用此查询选择了正确的行。

  SELECT a.meta_id, a.post_id, a.meta_key, a.meta_value,
         b.meta_value AS address
    FROM wp_postmeta a
    JOIN wp_postmeta b  ON a.post_id = b.post_id
                       AND b.meta_key = 'address'
                       AND b.meta_value LIKE '%Portland%'
   WHERE a.meta_key = 'post_city_id'

post_meta中将要更新的行包含此结果集中显示的meta_id值。