我想知道如何使用另一个表中的值来更新表,我需要设置一个限制,因为我有数千行需要更新,而PHPmyadmin无法处理该负载。 (我没有直接访问服务器)
我的表格结构如下所示
wp_postmeta
meta_id,
post_id,
meta_key,
meta_value
wp_map
oldmap, newmap
我需要做的是加入wp_postmeta.meta_value
和wp_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;
我读过有关创建子查询的内容,但找不到任何相关的示例,因此如果有人能指引我朝着正确的方向前进或提供一个有效的示例,我们将不胜感激。
答案 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