使用两个表的 MySQL UPDATE 查询

标签 mysql sql

使用下表:

post_meta

-----
meta_id     post_id     key                 value
-----
22          4546        Advantages          old value
23          4546        Article number      123

帖子

-----
id         status
-----
4546       pending
4547       publish
4548       publish

我正在尝试编写更新查询以将“旧值”更改为“新值”,对于设置为“待处理”的帖子,其 ID 对应于“文章编号”设置为“123”的 post_meta 的 post_id。

我不知道如何进行……有什么想法吗?

最佳答案

如果您打算更改带有 meta_key = 'Advantages' 的行的值来自 'old value''new value'对于带有 meta_key = 'Article' 的行和 value = '123'存在对应的 post_idpostsstatus = 'Pending'那么我想你想要的查询是这样的:

update post_meta
join (
  select pm.meta_id
  from post_meta pm
  join posts p on pm.post_id = p.id
  where p.status = 'pending'
    and pm.`key` = 'Advantages' -- or pm.value = 'old value'
    and exists (
      select 1 
      from post_meta 
      where post_id = pm.post_id 
        and `key` = 'Article number' and value = '123') 
    ) t on post_meta.meta_id = t.meta_id
set value = 'new value';

Sample SQL Fiddle

对于您的示例数据,这将留下 post_meta表格看起来像这样:

| meta_id | post_id |            key |     value |
|---------|---------|----------------|-----------|
|      22 |    4546 |     Advantages | new value |
|      23 |    4546 | Article number |       123 |

关于使用两个表的 MySQL UPDATE 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32649934/

相关文章:

php - 如何在 PHP 和 MySQL 中操作数组?

mysql - 在这种情况下是否绝对需要多对多关系?

mysql - 从 SQL 表中删除重复项

sql - SSIS 2008 R2 : ROUND the float column

mysql - 复制所有行并更改但更改 store_id

sql - 如何处理 Oracle SQL 中的无效日期

mysql - 高效的 SQL 查询

mysql - 获取加入第二个表的聚合平均值并将它们显示在第一个表中的每个值旁边

mysql - 在 MySQL 中高效获取前一条记录(通过索引)

sql - 无法删除 SQL Server 2005 中的约束, "Could not drop constraint. See previous errors"