ババク:
ここで私が持っているテーブルのサンプルは次のとおりです。
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 ;