【问题标题】:SQL update row based on another rowSQL 根据另一行更新行
【发布时间】:2015-02-23 23:06:46
【问题描述】:

我有一个名为“wp_postmeta”的 wordpress 数据库表

看起来像这样(简化)

这是我想用英文做的,希望有人能帮我把它翻译成实际的 SQL 语句。

如果 meta_key(address) LIKE "%Portland%",将 meta_value(post_city_id) 更新为 7,17",其中 post_id 相同。

所以最后它看起来像:

我试过了,但执行时没有选择行。

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"

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

【问题讨论】:

  • 我试过了,但执行时没有选择行。

标签: mysql wordpress


【解决方案1】:

啊,神秘而奇妙的 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 值。

【讨论】:

  • 感谢 Ollie J,它成功了!还要感谢 eflores89 的建议
【解决方案2】:

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

1) 其中 meta_key = "post_city_id" AND

2) 其中同一列 =“地址”。

据我所见,要么是一个,要么是另一个。你不能两者兼得。这可能是一个错字。

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

 AND wp_postmeta.meta_value LIKE "%Portland"

【讨论】:

    猜你喜欢
    • 2020-04-17
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多