2011-10-17 14 views
1

タイトル自体ほど簡単ではありません。テーブルusersには、フィールドassignedlessonsがあります。このフィールドに格納されるデータは69|308|50|91のようなものです。すでに知っているように、ユーザーの複数のレッスンを同時に保持しています。私はこのフィールドのデータをuser_idと一緒にエクスポートし、新しく作成した別のテーブルuser_assigned_elearning_lessonsにインポートします。このテーブルの構造は、id,user_id,elearning_lesson_id,created_atです。インポート後に、新しいテーブル内の構造は次のようにする必要があります:あるテーブルから別のテーブルにデータをエクスポートする方法(MYSQL)

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

ソーステーブルの各行に値を分割して複数の行を挿入する必要があるため、他の人の提案にもかかわらず、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 
+0

私は本当に答えを書くために多くの時間を費やしてくれてありがとう。非常に役に立ちます。再度、感謝します –

2

おそらくINSERT ... SELECT FROMの構文を使用して調べたいと思うでしょう。ソーステーブルとデスティネーションテーブルの完全な詳細がなければ、それを超えることはできません。

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をご確認ください。

+0

感謝。エクスポートとインポート自体を除いて、変換が必要です。ユーザーのすべてのレッスンは、テーブルユーザーのフィールド無制限に|それらを分離する。今度は、割り当てられたレッスンをテーブルuser_assigned_elearning_lessonsの異なるレコードに分けたいと思います。ユーザーは、レッスン数に応じて複数のレコードを持つことができます。このINSERT SELECT MYSQL節でこれを行うことはできますか? –

関連する問題