一つのテーブルにinsertしながら、別のテーブルから値を取ってinsertするには?
解決済
回答 3
投稿
- 評価
- クリップ 0
- VIEW 1,670
初心者です。
phpファイルにおいて下記のように書きましたらDBにinsertできますが、
「
$sql = mysql_query("insert into table1 (item_code, addr) values('$mail[item_code]', '$mail[addr]')", $con);
」
下記のように書き加えたらうまくtable2からデータをとって、table1にinsertできません。
書き方が間違っていると思いますが、どなたか教えて頂けませんでしょうか。
「
$sql = mysql_query("insert all into table1 (item_code, addr) values('$mail[item_code]', '$mail[addr]') into t_table1 (maker, maker_name) select maker, maker_name from table2 order by goods_code limit 1", $con);
」
よろしくお願い致します。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
なんとなぁく やろうとしている事が解かるんですが(思い違いしてたらごめんなさい^^;)
一行のステートメントでそれをやるのは無茶じゃないですか?
事前にtable2
へselect
かけて値を変数に代入した後にt_table1
へinsert
..って感じじゃないかと
いずれにしても mysql_query()
等のMySQL 拡張モジュールは廃止予定らしいのでもう使わない方がいいと思いますよ
ご参考までに
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
まず、insert all
という構文はありません。
次に、insert ... values
構文とinsert ... select
構文をつなげることもできません。
Sora-tan様の回答のように一旦table2
テーブルからSELECT
してやるか、
別々のINSERT
文として実行する必要があります。
https://dev.mysql.com/doc/refman/5.6/ja/insert.html
以下のSQL文で、期待する動作になるかと思います。
INSERT INTO table1 (item_code, addr, maker, maker_name)
SELECT '$mail[item_code]', '$mail[addr]', maker, maker_name
FROM table2 WHERE goods_code = '$mail[item_code]';
https://dev.mysql.com/doc/refman/5.6/ja/insert-select.html
ただし、
table1 に item_code, addr, maker, maker_nameなどのカラムがありまして
とあるので、table1
テーブルにインサートしたいカラムを増やす際は、1行目の
INSERT INTO table1 (...)
部分と、2行目の
SELECT ...
部分に指定するカラムの数と順番を揃えるようにしてください。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
insert all は mysql使えないので
insert into table1 (item_code, addr) select '$mail[item_code]', '$mail[addr]' union select maker, maker_name from table2 order by goods_code limit 1
みたいには書けますけど、別にやったほうがいいんじゃないですか?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.13%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/04/20 21:47
2016/04/21 10:31 編集
ご質問からは順番が前後しますけど 先に
>mysql_query()の代わりは何を使えば...
php御本家のマニュアルによるとPHP 5.5.xからは
MySQL 拡張モジュール が非推奨になりました。これを使ってデータベースに接続すると、 E_DEPRECATED エラーが発生します。 かわりに MySQLi あるいは PDO_MySQL を使いましょう。
http://php.net/manual/ja/migration55.deprecated.php
...と言う事らしいです。
本題の SQLですけど 確認させて下さい。「t_table1」は誤記入で「table1」と「t_table1」は同一のテーブルですか?
あと 「table2」の構造ももう少し詳しく解かれば回答が得られやすくなると思います
私には、条件「WHERE 」なしの「order by goods_code limit 1」でSELECTしている所が不可解で^^;;;
ともかく一番ベタな方法で書くと
$sql1 = mysql_query("SELECT `maker`,`maker_name ` FROM `table2` WHERE 「抽出条件」ORDER BY `goods_code` limit 1", $con);
while ($row = mysql_fetch_assoc($sql1)) {
$maker = $row['maker'];
$maker_name = $row['maker_name'];
}
$sql2 = mysql_query("INSERT INTO `table1 `(`item_code`, `addr`, `maker`, `maker_name`) VALUES ('$mail[item_code]', '$mail[addr]', '$maker', '$maker_name')", $con);
こんな感じでしょうか?
2016/04/22 17:29
「t_table1」は誤記入で「table1」と「t_table1」は同一のテーブルです。
WHERE があまり理解できていないので、書けませんでしたが、書き方を調べて抽出条件に「table1」のIDが「table2」のIDと同じであると指定しましたら、ちゃんと動きました。
追加で申し訳ないのですが、一行のレコードにitem_code1とitem_code2がありまして、それぞれmaker, maker_nameとある仕様ですが、この場合、以下のように書いた場合、実行できました。
しかし、片っ方しか入力しなかった場合、テーブルにinsertしませんでした。この場合、どう書けばよろしいでしょうか。
「
$sql1 = mysql_query("SELECT `maker`,`maker_name ` FROM `table2` WHERE 「抽出条件」ORDER BY `goods_code` limit 1", $con);
while ($row = mysql_fetch_assoc($sql1)) {
$maker1 = $row['maker'];
$maker_name1 = $row['maker_name'];
}
$sql2 = mysql_query("SELECT `maker`,`maker_name ` FROM `table2` WHERE 「抽出条件」ORDER BY `goods_code` limit 1", $con);
while ($row = mysql_fetch_assoc($sql2)) {
$maker2 = $row['maker'];
$maker_name2 = $row['maker_name'];
}
」
2016/04/22 17:56
2016/04/23 12:40
SELECTするカラムをいちいち全部記入しないで短縮するには
「SELECT * FROM `table2` WHERE 「抽出条件」ORDER BY `goods_code` limit 1」
となります。