こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

別テーブルからselectした値を他のテーブルにinsertしたいのですが、上手くできません

以下のように行ったのですが、
全ての値が別テーブルにinsertされません。

$sql = "SELECT tbl_A.id, tbl_A.data FROM tbl_A ";
$rst = mysql_query( $sql );
while ( $col = mysql_fetch_array( $rst ) ) {
$sql = "INSERT INTO tbl_B (
         date,
id,
data
) VALUES (
'" . date( 'Y-m-d' ) . "',
'" . mysql_real_escape_string( $col['id'] ) . "',
'" . mysql_real_escape_string( $col['data'] ) . "'
)";
}
このやり方では、テーブル内の1つの値しかinsertされません。
selectされた全ての値をinsertするにはどのようにしたら良いのでしょうか?
よろしくお願いします。
DB:mysql5
SP:php5

投稿日時 - 2009-08-12 15:10:22

QNo.5201716

すぐに回答ほしいです

質問者が選んだベストアンサー

『最後の1件』と『コードの全体像』から
insert文は作られているけど、実行がされていないかもです。
たぶんループ外(while文)でinsert文を実施しているため
最後の1件だけがinsertされている。

insert文を実行している箇所を変更したくない場合は、
連結していけばいいのかななんて思います。
(件数によっては現実的ではないかもですが・・・)
上記の場合、while文の1つ上で
$sql = "";
クエリ文の初期化をし、
$sql = "INSERT INTO db_test.tbl_test_new (
の部分を
$sql .= "INSERT INTO db_test.tbl_test_new (
にする。

投稿日時 - 2009-08-13 10:18:37

補足

アドバイスありがとうございます。
別件で四苦八苦していたもので返信が遅くなりました。

>連結していけばいいのかななんて思います。
こんな考え方もあるのですね!!
イレギュラーな方法のような気もしますが、
こうゆうのもありですよね!

まだ、テストしていませんがこれでいけるような気がします。
※新規テーブルに挿入する項目は多くはないからです。
基本は私も一般人(何しろ独学なもので・・・)なので。

でも、凄いことですね。
一般人の参考意見なのですね。
たくさんの事例を扱っていなければできない回答ですよね。
(請負業務だけが実績じゃないですものね。)
何しろ、チャチャも含めて回答して下さったのは、
YEND77様だけですから。
YEND77を尊敬いたします!!

実は、今作成しているwebアプリを携帯にも対応できるように実装しなくてはいけないので奮闘中なのです。

お忙しい中、
アドバイスを下さり、ありがとうございます。

検証結果を後日お知らせいたしますね。
よろしくお願いいたします。

投稿日時 - 2009-08-14 06:05:25

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

postした変数を使うにはやはりfetchでくるくる回すやり方ですかね。。。
確認ですが、フェッチループ内で、
$rst2 = mysql_query( $sql );
などとクエリの実行はしているんですよね。
あと、トランザクションはきってますか?
あと、挿入されているデータは、最初の1件ですか?最後の1件ですか?
select にorder by等をかけて順序性を規定して試して
いただけますか?

追記:
前回のURLすこし張り間違いです。
http://ftp.ntu.edu.tw/MySQL/doc/refman/5.1/ja/insert-select.html

投稿日時 - 2009-08-12 18:16:57

補足

新たに回答していただきまして、
ありがとうございます。
よろしくお願いします。

>などとクエリの実行はしているんですよね。
実行しております。

>あと、挿入されているデータは、最初の1件ですか?最後の1件ですか?
最後の1件です。

>トランザクションはきってますか?
意味がよくわかりません。スミマセン。。。
調べてみます。

全体像が分からないとアドバイスをしずらいですよね。
ということで、
詳細コードを記述します。

function date_rst( $year, $month, $day, $add_date ) {
$base = mktime( 0, 0, 0, $month, $day, $year );
$date = $add_date * 86400;
$date_rst = $base + $date;
return date( "Y-m-d 00:00:00", $date_rst );
}

$sql = "SELECT db_test.tbl_test.test_id, db_test.tbl_test.base_days
FROM db_test.tbl_test
WHERE db_test.tbl_test.test00_id = '" . mysql_real_escape_string( $_SESSION['test00_id'] ) . "'
AND db_test.tbl_test.base_days != '0000-00-00 00:00:00'";
$rst = mysql_query( $sql );
while ( $col = mysql_fetch_array( $rst ) ) {

$year = substr ( $col['base_days'], 0, 4 );
$month = substr ( $col['base_days'], 5, 2 );
$day = substr ( $col['base_days'], 8, 2 );

$add_date = $col['base_days'];

$rst_date = date_rst ( $year, $month, $day, $add );

$sql = "INSERT INTO db_test.tbl_test_new (
reg_date,
test_id,
test00_id,
rst_date,
state
) VALUES (
'" . date( 'Y-m-d H:i:s' ) . "',
'" . mysql_real_escape_string( $col['test_id'] ) . "',
'" . mysql_real_escape_string( $_SESSION['test00_id'] ) . "',
'" . mysql_real_escape_string( $rst_date ) . "',
'1'
)";
}

やりたいことはご理解いただけてると思いますので、
上記を上手く実行させたいのですが、
できますでしょうか?

よろしくお願いします。

投稿日時 - 2009-08-12 22:06:19

ANo.1

mysql5 はしらないのですが、、、
insert into select の構文が簡単かと思います。
(フェッチでやる方法もあるかと思いますが・・・)

http://ftp.ntu.edu.tw/MySQL/doc/refman/5.1/ja/insert.html

投稿日時 - 2009-08-12 15:46:21

補足

回答ありがとうございます。

>insert into select の構文が簡単かと思います。
この場合、仮にtbl_Aのフィールド値“data”に変更を加えた場合は、
どのように対応したら良いのでしょうか?

例)
$sql = "SELECT tbl_A.id, tbl_A.data FROM tbl_A ";
$rst = mysql_query( $sql );
while ( $col = mysql_fetch_array( $rst ) ) {
$add = "$_POST['add']";
$data = ( $col['data'] + $add );
  ↑ 追加。実際はもう少し複雑なのですが・・・・
$sql = "INSERT INTO tbl_B (
date,
id,
data
) VALUES (
'" . date( 'Y-m-d' ) . "',
'" . mysql_real_escape_string( $col['id'] ) . "',
'" . mysql_real_escape_string( $data ) . "' ←変数になった場合
)";
}

引き続き、アドバイスなどよろしくお願いします。

投稿日時 - 2009-08-12 15:48:57

あなたにオススメの質問