如何将数据从一个表导出到另一个表(MYSQL)

时间:2011-10-17 15:41:25

标签: php mysql

它并不像标题本身那么容易。我有一个表users,其中有一个字段assignedlessons。存储在此字段中的数据类似于69|308|50|91。您可能已经知道,它同时保留了用户的几个课程。我要做的是从此字段导出数据和user_id并导入另一个新创建的表user_assigned_elearning_lessons。此表的结构为:iduser_idelearning_lesson_idcreated_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

我该怎么做?

3 个答案:

答案 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