ソーステーブルの各行に値を分割して複数の行を挿入する必要があるため、他の人の提案にもかかわらず、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でプリペアドステートメントにパラメータをバインド:"ii"
は、これらのパラメータの型が整数と整数であることを意味
$stmt->bind_param("ii", $user->user_id, $lesson);
。
このテストデータと出力は次のようになります。お返事ミール用
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
私は本当に答えを書くために多くの時間を費やしてくれてありがとう。非常に役に立ちます。再度、感謝します –