【问题标题】:How to Parse PHP Searilize data in Mysql Stored Procedure & Looping it如何在 Mysql 存储过程中解析 PHP Searilize 数据并循环它
【发布时间】:2014-08-07 06:48:11
【问题描述】:

我在 Mysql Column 中有以下数据(以序列化形式存储所有数据 - 用逗号分隔到列中),我想在 Mysql 存储过程中获取/获取此列数据,并希望循环每个数据并插入另一个 trans表。

所以如果我的数据如下所示,那么我想在 trans 表中插入 7 条记录。

{"FormBuilderId":"5","vAnswer":"Develeop"},
{"FormBuilderId":"15","vAnswer":"Search Engine"},
{"FormBuilderId":"13","vAnswer":"10-15"},
{"FormBuilderId":"6","vAnswer":"Tester entered"},
{"FormBuilderId":"1","vAnswer":"Female"},
{"FormBuilderId":"14","vAnswer":"Moon.jpg"},
{"FormBuilderId":"12","vAnswer":"TV,dancing and modeling"}

我的表结构和数据如下表:

CREATE TABLE IF NOT EXISTS `idea_history` (
    `iIdeaHistoryId` int(11) NOT NULL AUTO_INCREMENT,
    `iApplicationId` tinyint(11) unsigned DEFAULT '0',
    `tAnswerData` text COMMENT 'all answer data store here in json format',
    `dAddedDate` datetime NOT NULL,
    PRIMARY KEY (`iIdeaHistoryId`),
    KEY `iApplicationId` (`iApplicationId`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='history comes here' AUTO_INCREMENT=57 ;

--
-- Dumping data for table `idea_history`
--

INSERT INTO idea_history (
  iIdeaHistoryId,
  iApplicationId,
  tAnswerData,
  dAddedDate
) 
VALUES
  (
    53,
    2,
    '{"FormBuilderId" : "2","vAnswer":"Environmental Group"},{"FormBuilderId" : "11","vAnswer":"Satelite"},{"FormBuilderId" : "3","vAnswer":"HB"},{"FormBuilderId" : "4","vAnswer":"Dev"},{"FormBuilderId" : "7","vAnswer":"HB"},{"FormBuilderId" : "8","vAnswer":"Balaji Satellite"},{"FormBuilderId" : "10","vAnswer":""}',
    '2014-07-05 19:20:56'
  ),
  (
    54,
    1,
    '{"FormBuilderId":"5","vAnswer":"Hello krishna|kanth double"},{"FormBuilderId":"15","vAnswer":"Website"},{"FormBuilderId":"6","vAnswer":"need to check"},{"FormBuilderId":"13","vAnswer":"20-25"}',
    '2014-07-05 19:20:56'
  ),
  (
    55,
    2,
    '{"FormBuilderId":"11","vAnswer":"comapnay"},{"FormBuilderId":"8","vAnswer":"here am|chw "},{"FormBuilderId" : "10","vAnswer":""},{"FormBuilderId":"9","vAnswer":"Business"}',
    '2014-07-05 19:20:56'
  ) ;

我将在存储过程中传递iIdeaHistoryId,它会获取tAnswerData 字段的值并将该值分割并插入到另一个trans 表中。

您能否指导我在存储过程中需要更改的内容?

【问题讨论】:

    标签: php mysql stored-procedures cursor


    【解决方案1】:

    你可以这样做

    SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(your_variable,'{"',-1),'":"',1) INTO arg_1;
    SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(your_variable,'":"',-2),'","',1) INTO arg_2;
    SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(your_variable,'","',-1),'":"',1) INTO arg_3;
    SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(your_variable,'":"',-1),'"}',1) INTO arg_4;
    
    INSERT INTO trans VALUES (arg_1,arg_2,arg_3,arg_4); 
    

    或者如果您想在存储过程中执行此操作,请在此处添加您的数据

        DELIMITER $$
        DROP PROCEDURE IF EXISTS trans$$
        CREATE PROCEDURE trans()
        BEGIN
        DECLARE arg_1,arg_2,arg_3,arg_4 VARCHAR(100);
        DECLARE finished INTEGER DEFAULT 0;
        DECLARE cursor_name CURSOR FOR YOUR_SELECT_statement;
    
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;
    
        OPEN cursor_name;
          my_loop: LOOP
            FETCH cursor_name INTO your_variable;
            IF finished = 1 THEN 
              LEAVE my_loop;
            END IF;
              SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(your_variable,'{"',-1),'":"',1) 
              INTO arg_1 FROM your_table;
              SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(your_variable,'":"',-2),'","',1) 
              INTO arg_2 FROM your_table;
              SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(your_variable,'","',-1),'":"',1) 
              INTO arg_3 FROM your_table;
              SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(your_variable,'":"',-1),'"}',1) 
              INTO arg_4 FROM your_table;
              INSERT INTO trans VALUES (arg_1,arg_2,arg_3,arg_4); 
        END LOOP my_loop;
        CLOSE cursor_name;
    
        END$$
    
        DELIMITER ;
    

    一栏你用这个

    DELIMITER $$
        DROP PROCEDURE IF EXISTS trans$$
        CREATE PROCEDURE trans(IN in_iIdeaHistoryId INT)
    BEGIN
        DECLARE arg_1 VARCHAR(100);
          SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(`tAnswerData`,' ',''),'{"',-1),'":"',1) 
              INTO arg_1 FROM `idea_history` WHERE iIdeaHistoryId=in_iIdeaHistoryId;
              INSERT INTO trans VALUES (arg_1); 
        END$$
    DELIMITER ;
    

    然后这样称呼它

    CALL `trans`(53);
    

    【讨论】:

    • 感谢您的回答。我只想循环进入存储过程/函数。我修改了我的问题(提交的表结构)所以请你帮我在存储过程中改变什么?
    • 我添加了程序
    • 是的,它正在工作,但它只是在表中插入一个条目。我发现下面的帖子对我很有帮助。 stackoverflow.com/questions/17121304/…
    【解决方案2】:

    这看起来像 JSON。使用 php 函数 json_decode() 将 json 数据存储到一个数组中,然后您可以在该数组上使用 foreach 循环。在循环内,您可以放置​​条件,当它满足时,您可以使用插入查询将其存储在数据库中。

    这对你有帮助吗?

    如果您可以进一步解释您正在尝试做什么以及您的状况如何,那么我可能会给您一个更好的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-21
      • 2015-03-22
      • 2013-11-13
      • 1970-01-01
      • 1970-01-01
      • 2021-04-23
      • 1970-01-01
      相关资源
      最近更新 更多