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

Php 如何将数据从一个表导出到另一个表(MYSQL),php,mysql,Php,Mysql,它不像标题本身那么容易。我有一个表users,其中有一个字段assignedlessons。此字段中存储的数据类似于69 | 308 | 50 | 91。正如您可能已经知道的,它同时保存了用户的多个课程。我要做的是将此字段中的数据与user\u id一起导出,并导入到另一个新创建的表user\u assigned\u elearning\u lessons。此表的结构为:id,用户id,电子学习课程id,在创建。导入后,新表中的结构应如下所示: id user_id e

它不像标题本身那么容易。我有一个表
users
,其中有一个字段
assignedlessons
。此字段中存储的数据类似于
69 | 308 | 50 | 91
。正如您可能已经知道的,它同时保存了用户的多个课程。我要做的是将此字段中的数据与
user\u id
一起导出,并导入到另一个新创建的表
user\u assigned\u elearning\u lessons
。此表的结构为:
id
用户id
电子学习课程id
创建。导入后,新表中的结构应如下所示:

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

我如何做到这一点?

您可能需要研究语法的使用。如果没有源表和目标表的完整详细信息,我们将无能为力。

您可以使用如下语法:

INSERT INTO tbl2 (col1, col2, col3, ....)
SELECT col1, col2, col3
FROM tbl1

或者查看更多详细信息。

不管其他人怎么建议,您都无法使用
INSERT。。。选择
syntax,因为必须拆分值并为源表的每一行插入多行

您可以编写一个简短的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
面向对象的风格和准备好的语句来构建insert查询

<?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;
}
?>
其中,
“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

谢谢你的回复和平号。除了导出和导入本身,还需要进行一些转换。用户的所有课程都存储在表用户的字段assignedlessons中,并使用|将它们分开。现在,我想将这些分配的课程分离到“用户分配的在线学习课程”表中的不同记录。一个用户可以有多个记录,具体取决于他上了多少课。我能用这个INSERT SELECT MYSQL子句做到这一点吗?我真的很感谢你花了很多时间来写答案。这很有帮助。再次感谢
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