它并不像标题本身那么容易。我有一个表users
,其中有一个字段assignedlessons
。存储在此字段中的数据类似于69|308|50|91
。您可能已经知道,它同时保留了用户的几个课程。我要做的是从此字段导出数据和user_id
并导入另一个新创建的表user_assigned_elearning_lessons
。此表的结构为:id
,user_id
,elearning_lesson_id
,created_at
。导入后,新表中的结构应如下所示:
id user_id elearning_lesson_id created_at
1 1 69 2011-01-12
2 1 308 2011-04-11
3 2 50 2011-05-18
4 3 91 2011-05-21
5 3 50 2011-07-18
6 3 308 2011-07-18
我该怎么做?
答案 0 :(得分:2)
您可能希望研究使用INSERT ... SELECT FROM
语法。如果没有源表和目标表的完整细节,我们就无法帮助。
答案 1 :(得分:0)
您可以使用以下语法:
INSERT INTO tbl2 (col1, col2, col3, ....)
SELECT col1, col2, col3
FROM tbl1
或查看http://dev.mysql.com/doc/refman/5.1/en/insert-select.html了解更多详情。
答案 2 :(得分:0)
尽管其他人提出了建议,但您无法使用INSERT ... SELECT
语法执行所需操作,因为您需要拆分值并为源表的每一行插入多行。
您可以编写一个简短的PHP脚本来完成这项工作,我假设了以下表结构和测试数据:
CREATE TABLE IF NOT EXISTS `users` (
`user_id` int(11) NOT NULL,
`assignedlessons` varchar(100) NOT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `users` (`user_id`, `assignedlessons`) VALUES
(1, '69|308|50|91'),
(2, '56|34|7');
CREATE TABLE IF NOT EXISTS `user_assigned_elearning_lessons` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`elearning_lesson_id` int(11) NOT NULL,
`created_at` date NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ;
使用PHP脚本,您可以遍历第一个表的所有行,将复合字段分解为其部分,并为每个部分执行INSERT语句。我使用mysqli
面向对象的样式和预准备语句来构建插入查询。
<?php
main();
function main() {
$source = new mysqli("localhost", "username", "password", "database");
$destin = new mysqli("localhost", "username", "password", "database");
$stmt = prepareInsertStatement($destin);
$result = $source->query("SELECT user_id, assignedlessons FROM users");
while ($user = $result->fetch_object()) {
insertUser($stmt, $user);
}
$result->close();
$source->close();
$destin->close();
}
function insertUser(&$stmt, &$user) {
$lessons = explode('|', $user->assignedlessons);
foreach ($lessons AS $lesson) {
$stmt->bind_param("ii", $user->user_id, $lesson);
$stmt->execute();
echo "User " . $user->user_id . " lesson $lesson<br/>";
}
}
function &prepareInsertStatement(&$destin) {
$sql = "INSERT INTO user_assigned_elearning_lessons
(user_id, elearning_lesson_id, created_at) VALUES (?, ?, NOW())";
$stmt = $destin->stmt_init();
$stmt->prepare($sql);
return $stmt;
}
?>
我将参数绑定到带有bind_param的预准备语句:
$stmt->bind_param("ii", $user->user_id, $lesson);
"ii"
表示这些参数的类型是整数和整数。
此测试数据的输出将为:
User 1 lesson 69
User 1 lesson 308
User 1 lesson 50
User 1 lesson 91
User 2 lesson 56
User 2 lesson 34
User 2 lesson 7