我获得了一个mySQL数据库,可以重构为OpenCart安装。
我已经提取了大部分数据,但在旧网站中“产品类别”已全部放在一列中
|228|243|228|239|228|
要么
|88|
要么
|88|243|
所以我不知道在任何特定记录中会有多少。
我不想使用php函数来解压缩,因为我手动将带有SQL查询的数据提取到新数据库中。
更复杂的是,我必须在products_to_categories
中为列中的每个值创建一个新行 - 我不介意多步骤过程,我不希望使用单个查询执行此操作 - 我希望避免重新输入所有数据。
我知道这与MySQL Split String类似,但我不认为它是重复的,因为它没有完全回答我的问题,因为列中可能有任意数量的值 - 而不仅仅是2。
[编辑]我尝试过common_schema,但是按照我目前的技术水平,我发现很难得到我想要的结果,但我肯定会在将来使用它。为了记录,这最接近我的解决方案 - Can you split/explode a field in a MySQL query?
答案 0 :(得分:4)
我建议的一个选项是使用common_schema,特别是get_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));