0

次の配列を検討してください。

"Bank of America"    => "BOA",
"Microsoft"          => "MSFT",
"Berkshire Hathaway" => "BRK"

実際には、アレイの長さは 100 ペアです。テキストレコードを含むMySQLテーブル「文字列」がある場合:

str_id  str_text
-------------------------------------------------------------
1       I wish I had bought Berkshire Hathaway in the 1980's!
2       Microsoft to release Windows 8 in 4 flavours

方法はありますか - SQL で! - 何百万ものすべてのレコードをループして、すべての会社名をティッカーに置き換えますか? クエリが完了すると、文字列テーブルは次のようになりますか?

str_id  str_text
-------------------------------------------------------------
1       I wish I had bought BRK in the 1980's!
2       MSFT to release Windows 8 in 4 flavours

PHPで可能であるため、私は尋ねていますが、数千のレコードを取得し、それらをループし、それらを更新し、crontabを使用してさらに数千を取得する必要があるため、本質的に遅くなります.

4

2 に答える 2

2

PHP を使用しない代替 (MySQL のみ):

MySQL プロシージャを作成します。

    DELIMITER // 
    DROP PROCEDURE IF EXISTS replace_strings// 
    CREATE PROCEDURE replace_strings(IN table_name VARCHAR(100), IN field_name VARCHAR(100))

    BEGIN

    DECLARE done INT DEFAULT FALSE;
    DECLARE str_from VARCHAR(255);
    DECLARE str_to VARCHAR(255);
    DECLARE cur1 CURSOR FOR SELECT string_from, string_to FROM replacements;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    OPEN cur1;

    read_loop: LOOP
        FETCH cur1 INTO str_from, str_to;
        IF done THEN
            LEAVE read_loop;
        END IF;

    SET @sql_command = CONCAT("UPDATE ",table_name," SET ",field_name," = REPLACE(",field_name,", '",str_from,"', '",str_to,"')");
    PREPARE stmt FROM @sql_command;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;

    END LOOP;

    CLOSE cur1;

    END // 
    DELIMITER ;

replacementsフィールドstring_fromと を含むテーブルを作成しますstring_to。このテーブルに可能な自動変更を追加します。

コードでプロシージャ コールを使用します。

    CALL replace_strings('strings','str_text');
于 2013-02-22T11:42:02.647 に答える
1

REPLACE関数を使わないのはなぜですか?

update 
  mytable 
set 
  str_text=replace(str_text, 'Bank of America', 'BOA');

したがって、配列を反復処理して、その sql リクエストを実行する必要があります。

foreach ($myarr as $key=>$val) {
//exec sql
}
于 2012-04-17T17:12:38.110 に答える