如何按ID筛选行,然后更新具有相同ID的其他行

时间:2014-09-25 20:05:10

标签: mysql sql wordpress

我是编写SQL语句的新手,所以如果这是一个提出SQL问题的循环方式,请原谅我。顺便说一句,这与Wordpress的wp_postmeta数据库有关。

我试图在我写的这句话中选择行:

SELECT post_id FROM wp_postmeta WHERE meta_key = 'pb-city'

并使用这些post_id来过滤使用SAME post_id但在meta_key列中使用不同键的行。那时,我相信我会运行的代码看起来像这样:

UPDATE wp_postmeta SET meta_value='locations-page' WHERE meta_key='_wp_page_template'

我认为问题是我不知道在更新表时如何过滤我的范围。我知道如何过滤,我知道如何更新,但我不知道如何采用过滤表并更新某些值。

有什么建议吗? 谢谢!

2 个答案:

答案 0 :(得分:2)

有几种方法可以做到这一点。假设您的唯一标识符名为id

,请将此表连接回自身
update wp_postmeta p1
  join wp_postmeta p2 on p1.id <> p2.id and p1.post_id = p2.post_id
set p1.meta_value='locations-page' 
where p1.meta_key='_wp_page_template'
  and p2.meta_key = 'pb-city';

或者,您也可以将EXISTS与相关子查询一起使用,但是您必须使用其他子查询,因为rdbms存在轻微限制并在使用时更新记录子查询中的同一个表:

update wp_postmeta p1
set p1.meta_value='locations-page' 
where p1.meta_key='_wp_page_template' 
  and exists (
    select 1
    from (select * from wp_postmeta) p2
    where p1.id <> p2.id
      and p2.meta_key = 'pb-city'
      and p1.post_id = p2.post_id
    )

编辑:

重新阅读您的帖子,也许您没有id字段,但您只想加入meta_key不一样。如果是这种情况,您只需从查询中删除p1.id <> p2.id即可。

答案 1 :(得分:0)

尝试选择

从wp_postmeta中选择*,其中post_id in(SELECT post_id FROM wp_postmeta WHERE meta_key =&#39; pb-city&#39;)和meta_key&lt;&gt; &#39; PB-城市&#39;

更新取决于您的范围,例如

更新wp_postmeta设置SET meta_value =&#39; locations-page&#39;在哪里post_id(SELECT post_id FROM wp_postmeta WHERE meta_key =&#39; pb-city&#39;)和meta_key =&#39; _wp_page_template&#39;

在更新之前尝试使用

结果

从wp_postmeta中选择* WHERE post_id in(SELECT post_id FROM wp_postmeta WHERE meta_key =&#39; pb-city&#39;)和meta_key =&#39; _wp_page_template&#39;