当字段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) ;
答案 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';
}
}
}