mysql:在出现相同值的列中更新行更改值

mysql:在出现相同值的列中更新行更改值,mysql,sql,Mysql,Sql,你能帮我准备一个sql吗?它可以通过将meta_键有“_缩略图_id”值的行的“meta_值”设置为“post_id”值来更改meta_键有“_wp_attached_file”值且“meta_值”有相同图像名称的行的列meta_值。 这有点复杂,所以我给你举个例子。我想改变这一点: +---------+---------+------------------+--------------+ | meta_id | post_id | meta_key | meta_value

你能帮我准备一个sql吗?它可以通过将meta_键有“_缩略图_id”值的行的“meta_值”设置为“post_id”值来更改meta_键有“_wp_attached_file”值且“meta_值”有相同图像名称的行的列meta_值。 这有点复杂,所以我给你举个例子。我想改变这一点:

+---------+---------+------------------+--------------+
| meta_id | post_id | meta_key         | meta_value   |
+---------+---------+------------------+--------------+
| 312     | 170     | _wp_attached_file| IMGP0289.jpg | 
| 313     | 54      | _thumbnail_id    | IMGP0289.jpg | 
| 314     | 169     | _wp_attached_file| IMGP0453.jpg | 
| 315     | 53      | _thumbnail_id    | IMGP0453.jpg | 
为此:

+---------+---------+------------------+--------------+
| meta_id | post_id | meta_key         | meta_value   |
+---------+---------+------------------+--------------+
| 312     | 170     | _wp_attached_file| IMGP0289.jpg | 
| 313     | 54      | _thumbnail_id    | 170          | 
| 314     | 169     | _wp_attached_file| IMGP0453.jpg | 
| 315     | 53      | _thumbnail_id    | 169          |

非常感谢。

这里有一个临时表克隆辅助解决方案

下面是演示,使用提供的数据进行验证,结果与预期一致

SQL:

输出:

mysql> SELECT * FROM tbl;
+---------+---------+-------------------+--------------+
| meta_id | post_id | meta_key          | meta_value   |
+---------+---------+-------------------+--------------+
|     312 |     170 | _wp_attached_file | IMGP0289.jpg |
|     313 |      54 | _thumbnail_id     | IMGP0289.jpg |
|     314 |     169 | _wp_attached_file | IMGP0453.jpg |
|     315 |      53 | _thumbnail_id     | IMGP0453.jpg |
+---------+---------+-------------------+--------------+
4 rows in set (0.00 sec)

mysql> -- query needed
mysql> CREATE TEMPORARY TABLE tbl_tmp LIKE tbl;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO tbl_tmp SELECT * FROM tbl;
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> UPDATE
    ->     tbl t1
    -> SET
    ->     meta_value = (SELECT
    ->                         post_id
    ->                     FROM
    ->                         tbl_tmp t2
    ->                     WHERE
    ->                         t1.meta_value = t2.meta_value AND
    ->                         t2.meta_key = '_wp_attached_file'
    ->                     LIMIT 1
    ->                     )
    -> WHERE
    ->     t1.meta_key = '_thumbnail_id';
 FROM Query OK, 2 rows affected (0.00 sec)
Rows matched: 2  Changed: 2  Warnings: 0

mysql> SELECT * FROM tbl;
+---------+---------+-------------------+--------------+
| meta_id | post_id | meta_key          | meta_value   |
+---------+---------+-------------------+--------------+
|     312 |     170 | _wp_attached_file | IMGP0289.jpg |
|     313 |      54 | _thumbnail_id     | 170          |
|     314 |     169 | _wp_attached_file | IMGP0453.jpg |
|     315 |      53 | _thumbnail_id     | 169          |
+---------+---------+-------------------+--------------+
4 rows in set (0.00 sec)
那么

UPDATE tbl x 
  JOIN tbl y
    ON y.meta_value = x.meta_value
   SET x.meta_value = y.post_id
 WHERE x.meta_key = '_thumbnail_id' 
   AND y.meta_key = '_wp_attached_file';

为什么要临时摆桌子?@草莓,因为没有另一张桌子的帮助,我没有做好准备。如果只使用tbl,我得到了“1093(HY000):您不能在FROM子句中为update指定目标表't1'。你有什么想法吗?@草莓,这太酷了!我学到了很多。你应该以ans的身份发布。
UPDATE tbl x 
  JOIN tbl y
    ON y.meta_value = x.meta_value
   SET x.meta_value = y.post_id
 WHERE x.meta_key = '_thumbnail_id' 
   AND y.meta_key = '_wp_attached_file';