2

OpenCart インストールに再構築するための mySQL データベースが与えられました。

ほとんどのデータをまとめましたが、古いサイトでは「製品カテゴリ」がすべて 1 つの列にまとめられていました。

|228|243|228|239|228| または |88| または |88|243|

したがって、特定のレコードにいくつ含まれるかはわかりません。

SQLクエリを使用してデータを新しいデータベースに手動で抽出しているため、これを抽出するためにphp関数を使用したくありません。

追加の複雑さはproducts_to_categories、列の各値に対して新しい行を作成する必要があることです-複数のステップのプロセスを気にしません.単一のクエリでこれを行うことを期待していません-再回避しようとしています-すべてのデータを入力します。

これはMySQL Split Stringに似ていることは知っていますが、列には2つだけでなく、任意の数の値がある可能性があるため、私の質問に完全には答えていないため、重複しているとは思いません.

[編集] common_schema を試してみましたが、現在のスキルのレベルでは求めていた結果を得るのが難しいことがわかりましたが、将来的には確実に使用します。レコードについては、これが私の解決策に最も近いです-MySQLクエリでフィールドを分割/分解できますか?

4

1 に答える 1

4

私がお勧めするオプションの 1 つは、common_schemaと、具体的には functionsget_num_tokens()とを使用split_token()することです。これは役に立ちます。

ソリューションに適応できる簡単な使用例を次に示します。

/* CODE FOR DEMONSTRATION PURPOSES */

/* Need to install common_schema - code.google.com/p/common-schema/ */ 

/* Procedure structure for procedure `explode1` */     

/*!50003 DROP PROCEDURE IF EXISTS  `explode1` */;

DELIMITER $$

CREATE PROCEDURE `explode1`(str varchar(65500), delim VARCHAR(255))
BEGIN
    DECLARE _iteration, _num_tokens INT UNSIGNED DEFAULT 0;
    DROP TEMPORARY TABLE IF EXISTS `temp_explode`;
    CREATE TEMPORARY TABLE `temp_explode` (`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `word` VARCHAR(200), PRIMARY KEY (`id`));
    SET _num_tokens := (SELECT `common_schema`.`get_num_tokens`(str, delim));
    WHILE _iteration < _num_tokens DO
        SET _iteration := _iteration + 1;
        INSERT INTO `temp_explode` (`word`) SELECT `common_schema`.`split_token`(str, delim, _iteration);
    END WHILE;
    SELECT `id`, `word` FROM `temp_explode`;
    DROP TEMPORARY TABLE IF EXISTS `temp_explode`;
END $$

DELIMITER ;

/* TEST */
CALL `explode1`('Lorem Ipsum is simply dummy text of the printing and typesetting', CHAR(32));
于 2013-11-03T19:09:21.817 に答える