MySQL更新加入限制

时间:2013-12-13 03:36:28

标签: mysql sql join phpmyadmin

我想知道如何使用另一个表中的值来更新表,我需要设置一个限制,因为我有数千行需要更新,而PHPmyadmin无法处理该负载。 (我没有直接访问服务器)

我的表格结构如下所示

wp_postmeta

meta_id, post_id, meta_key, meta_value

wp_map

oldmap, newmap

我需要做的是加入wp_postmeta.meta_valuewp_map.oldmap上的两个表格,并使用wp_postmeta.meta_value更新wp_map.newmap

这是我当前的查询,但我需要在查询中添加一个100 LIMIT,因为我将查询拆分为更小的块,以便PHPMyAdmin可以处理。

UPDATE wp_postmeta
INNER JOIN wp_map
ON wp_map.oldmap = wp_postmeta.meta_value
SET wp_postmeta.meta_value = wp_map.newmap;

我读过有关创建子查询的内容,但找不到任何相关的示例,因此如果有人能指引我朝着正确的方向前进或提供一个有效的示例,我们将不胜感激。

3 个答案:

答案 0 :(得分:8)

你可以这样试试

UPDATE wp_postmeta t JOIN
(
    SELECT p.meta_id, m.newmap
      FROM wp_postmeta p JOIN wp_map m
        ON p.meta_value = m.oldmap
     ORDER BY p.meta_id
     LIMIT 100
) s
   ON t.meta_id = s.meta_id
  SET t.meta_value = s.newmap;

这是 SQLFiddle 演示

答案 1 :(得分:0)

sqlFiddle 在这个例子中,我只做了5行,如果你愿意,你可以将限制更改为0,100

UPDATE wp_postmeta,
      (SELECT oldmap,newmap
       FROM wp_map 
       ORDER BY oldmap,newmap limit 0,5)as wp_map
SET wp_postmeta.meta_value = wp_map.newmap
WHERE wp_map.oldmap = wp_postmeta.meta_value

答案 2 :(得分:0)

这是非常规的,但它可以帮助你捏一下

SET @tmp_c = 0;
UPDATE
    table1
INNER JOIN table2 ON table1.id = table2.id
INNER JOIN table3 ON table2.id = table3.id
SET
    table1.remove_date = NOW() - INTERVAL 5 MONTH
WHERE
    table1.active = 1
AND
    (IF (table1.active = 1, @tmp_c := @tmp_c + 1 , 0 )) //This is to only increment the counter if the whole where matches
AND
    @tmp_c <= 15 //Start ignoring row items as soon as it exceeds the limit amount