【问题标题】:How to find and replace values of one column within the same column (Wordpress wp_postmeta table)如何在同一列中查找和替换一列的值(Wordpress wp_postmeta 表)
【发布时间】:2020-06-07 13:30:54
【问题描述】:

这是我的表格示例:

meta_id | post_id |  meta_key    | meta_value            
1       |  1001   |  Name        |  Jack                   
2       |  1002   |  Name        |  John                   
3       |  1001   |  Description |  Jack is 36 years old   
4       |  1002   |  Description |  John is Jack's brother

想在 meta_key 为“Description”的 meta_value 中找到 meta_key 为“Name”的 meta_value,并通过添加 post_id 来替换它。例如。在 meta_value 中搜索“Jack”,其中 meta_key 为“Description”,并将其替换为“Jack (post_id = 1001)”。

所以结果会是这样的:

meta_id | post_id |  meta_key    | meta_value            
1       |  1001   |  Name        | Jack                   
2       |  1002   |  Name        | John                   
3       |  1001   |  Description | Jack (post_id = 1001) is 36 years old   
4       |  1002   |  Description | John (post_id = 1002) is Jack (post_id = 1001)'s brother

只是让您知道该表有数百万条记录。任何帮助将不胜感激,干杯!

【问题讨论】:

  • 如果可能的话,请使用文字而不是图片来提问
  • @nbk 确定,它已更新

标签: mysql database wordpress


【解决方案1】:

正如我在评论中所说,您必须遍历每个名​​称才能重新替换它。

当然你不能运行两次,所以我会创建一个新列并将结果放在那里。

第二个问题不是唯一的名字,例如某人只有名字 John,例程会替换它,但假设首先有一个 John Malkovitch,它已经被替换,然后 John 将被替换为不同的 id 两次。名字也不是唯一的 John Claude Smith 可能会退出数百次。算法无法区分它们。

DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `procedure_name1`()
BEGIN
    DECLARE finished INTEGER DEFAULT 0;
    DECLARE _id INT DEFAULT 0;
    DECLARE _descrition TEXT DEFAULT "";
    DECLARE _descritionrep TEXT DEFAULT "";
    DECLARE _post_id INT DEFAULT 0;
    DECLARE _name TEXT DEFAULT ""; 
    -- declare cursor for DESCRITIOn
    DEClARE curnameexch 
        CURSOR FOR 
            SELECT `post_id`, `meta_value` FROM table2 WHERE `meta_key` = 'Name';

    DEClARE curdescritionexch 
        CURSOR FOR 
            SELECT `meta_id`,`meta_value` FROM table2 WHERE `meta_key` = 'Description';


    -- declare NOT FOUND handler
    DECLARE CONTINUE HANDLER 
        FOR NOT FOUND SET finished = 1;

    OPEN curdescritionexch;

    getdesiption: LOOP
        FETCH curdescritionexch INTO _id,_descrition;
        IF finished = 1 THEN 
            LEAVE getdesiption;
        END IF;
        -- build email list
        SET _descritionrep = _descrition;
            OPEN curnameexch;

            getname: LOOP
                FETCH curnameexch INTO _post_id,_name;
                IF finished = 1 THEN 
                    SET finished = 0;
                    LEAVE getname;
                END IF;
                -- build email list
                SET _descritionrep = REPLACE(_descritionrep,_name,
                      CONCAT(_name, ' (post_id = ',_post_id,')'));

            END LOOP getname;
            CLOSE curnameexch;
      --  aLL NAMES EXCHANGED
      UPDATE table2 set `meta_value` = _descritionrep 
      WHERE `meta_id` = _id; 
    END LOOP getdesiption;
    CLOSE curdescritionexch;
END$$
DELIMITER ;

【讨论】:

  • 非常感谢,感谢您花费的时间。四行中的“Jack”不会被您的结果中的 id 所取代。需要明确的是,Jack 或任何其他名称都可以在许多 Description 值中提及。
  • 只能通过存储过程或应用程序级别来实现,因为您必须检查每个描述是否与名称匹配,然后替换它。我会更新我的答案,但需要一段时间。
【解决方案2】:
/*
SELECT REPLACE(
  t1.meta_value, t.meta_value, CONCAT(t.meta_value, ' (post_id = ', t.post_id, ')'))
*/
UPDATE t1
FROM table t
LEFT JOIN table t1 ON t1.meta_key = 'Description' AND t.postId = t1.postId
SET meta_value := REPLACE(
  t1.meta_value, t.meta_value, CONCAT(t.meta_value, ' (post_id = ', t.post_id, ')'))
WHERE t.meta_key = 'Name'
;

【讨论】:

  • 感谢您的回复。不断收到语法错误。也许我对t和t1感到困惑。假设我的原始表名是 wp_postmeta。你会更新你的答案吗?
  • @Babak-Na 我更新了答案。现在应该不会出错了。
猜你喜欢
  • 2020-08-04
  • 1970-01-01
  • 2020-08-04
  • 2016-12-05
  • 1970-01-01
  • 2021-07-20
  • 2019-10-17
  • 2017-07-11
  • 1970-01-01
相关资源
最近更新 更多