同じ列(ワードプレスwp_postmetaテーブル)内の列の値を検索と置換する方法

ババク:

ここで私が持っているテーブルのサンプルは次のとおりです。

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がメタキーは「説明」であるとpost_idのを追加することによってそれを置き換えるmeta_valueに「名前」ですmeta_valueを見つけたいです。例えばmeta_keyは、「説明」であり、「ジャック(post_idの= 1001)」と置き換えmeta_valueに「ジャック」を検索します。

だから、結果はこのようになります:

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:

私がコメントで言ったように、あなたはそれをrepalceし、すべての名前をループしています。

私は新しい列を作成し、そこに結果を置くように、もちろんあなたは、二回実行することはできません。

第二の問題は、誰かがジョンは、ルーチンはそれを置き換えるが、最初にすでに交換されたジョン・Malkovitch、そこにあると言うことができますでしょう唯一の名前を持つ例えばユニークな名前ではありません、そしてジョンは異なるIDで二回置換されます。名前はまた、ジョン・クロード・スミスは、数百回を終了する場合があります固有のものではありません。このアルゴリズムは、それらを区別することはできません。

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 ;

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=6142&siteId=1