SQL从表中插入国家/地区名称

时间:2017-10-10 11:00:41

标签: mysql sql-insert

字段wp_agent_adds.countries每个字段的x国家/地区名称与a分隔时,如何从表wp_agent_adds 插入国家/地区名称到表 wp_agent_target_countries ','逗号。

  

意味着这应该是插入后的结果:

id = AUTO_INCREMENT
add_id = 2
meta_key = 'country'
meta_value = 'Netherlands'
id = AUTO_INCREMENT
add_id = 2
meta_key = 'country'
meta_value = 'Germany'
id = AUTO_INCREMENT
add_id = 2
meta_key = 'country'
meta_value = 'Polen'


See examples below.
  

源表wp_agent_adds.countries:

id  user_id countries
2   2       Netherlands,Germany,Polen
3   3       Netherlands
4   1       Netherlands,Belgium,Austria,Switzerland
7   100     Netherlands,Germany,Belgium
  

目标表:

wp_agent_target_countries (
  id int(12) NOT NULL AUTO_INCREMENT,
  add_id int(12) NOT NULL,
  meta_key varchar(64) NOT NULL,
  meta_value varchar(64) NOT NULL) ;

2 个答案:

答案 0 :(得分:0)

MySQL不提供拆分字符串的任何功能。 但是,可以使用递归存储过程来执行此操作。

CREATE PROCEDURE PROCESS_COUNTRIES(IN user_id INT UNSIGNED, IN countries VARCHAR(255))
BEGIN
  DECLARE comma_position INT UNSIGNED;
  DECLARE cur_country VARCHAR(255);
  DECLARE countries_left VARCHAR(255);
  SET max_sp_recursion_depth=10;

  SELECT LOCATE( ',', countries ) INTO comma_position;

  IF comma_position > 0 THEN
    SELECT SUBSTRING( countries, 1, comma_position-1 ) INTO cur_country;
    SELECT SUBSTRING( countries, comma_position+1) INTO countries_left;

    INSERT INTO wp_agent_target_countries( add_id,meta_key,meta_value) VALUES( user_id, 'country', cur_country);
    CALL PROCESS_COUNTRIES( user_id, countries_left);
  ELSE
    INSERT INTO wp_agent_target_countries( add_id,meta_key,meta_value) VALUES( user_id, 'country', countries);
  END IF;
END //

上面的过程递归地遍历字符串的每个国家/地区并将它们插入到wp_agent_target_countries中。

请注意,调用此过程并非易事,如果要在表的每个条目上调用它,则可能必须使用游标,这是性能不佳。

您可以考虑在代码中对此进行管理,或者更改您的表格结构,使其在wp_agent_adds中按国家/地区分配一个条目。

在SQLFiddle中测试:http://sqlfiddle.com/#!9/7e4872/1/0

答案 1 :(得分:0)

在PHP中你可以这样做:

$query = "SELECT id, countries FROM wp_agent_adds ORDER BY id";
$result = $wpdb->get_results($query);

foreach($result as $row) {
$cntr = explode(',', $row->countries);      
foreach($cntr as $name){
    if(!empty($name) || $name !='' || !isset($name) ) {             
        $inserted = $wpdb->insert($wpdb->prefix.'agent_target_countries', 
            array( 
                'add_id'        => $row->id,
                'meta_key'      => 'country',
                'meta_value'    => $name
            ),array('%d','%s','%s'  
            ) 
        );
    }
    if($inserted){
        echo 'done';
    }
}
}