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

締切り済みの質問

マスターデータ(商品マスタ、担当者)の全項目を子テーブル(注文票テーブル)に登録するよい方法は?

商品マスタ、担当者マスタがあります。
商品マスタの項目はたとえば次のようなものです。
product_id(主キー),size,color,price,....
担当者マスタの項目はたとえば次のようなものです。
salesman_id(主キー),local_area,global_area,....

注文票を登録するときに、注文票テーブルに商品(product)と担当者(salesman)を記録します。
このときに、product_id,とsalesman_id(主キー)を記録しますが、
注文票には、マスターの主キー以外のすべてのfieldも登録したいです。なぜなら、sizeやcolor、担当エリア(local_area,global_area)はしょっちゅう変わるからです。こんなことは、よくあることだと思いますが、、
たとえば、商品マスタのスペックがsize,color以外にも大量にある場合、注文された商品や担当者のIDを指定したときに、そのIDに加えてそれに付随するすべてのfieldのデータを注文票テーブルに登録(insert)するためのうまいMySQL構文なり、うまいPHPのプログラムの手法が知りたいです。よろしくお願いします。
一つ上の親テーブルならまだ何とかなりそうですが、2,3つ上の親テーブルのfieldをとってきて、注文票に登録するような方法は、さらに難しくて、こまってます。

投稿日時 - 2007-10-13 01:28:17

QNo.3424544

すぐに回答ほしいです

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

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

回答(2)

ANo.2

多段階層になった正規化されたテーブルであれば
子供に対してどんどん親テーブルをinner joinしていくだけでは?

投稿日時 - 2007-10-13 15:05:31

お礼

ありがとうございました。大変参考になりました。

投稿日時 - 2007-10-14 11:41:11

ANo.1

MySQLの質問をする場合は、バージョンの明記をお願いします。
MySQL 4.0以前、4.1、5.0以降で大きな機能追加や一部の仕様変更もあり、せっかく具体的なSQLを提示しても、質問者さんの環境では使えないかも知れませんので。

>注文票を登録するときに、注文票テーブルに商品(product)と担当者(salesman)を
>記録します。
>このときに、product_id,とsalesman_id(主キー)を記録

注文票テーブルの主キーは、注文idといった列にするのですよね???

>なぜなら、sizeやcolor、担当エリア(local_area,global_area)はしょっちゅう変わるから

担当エリアが変わるのは分かりますが、sizeやcolorも変わるのですか?これらが変われば、別のproduct_idになるように感じますが?

商品や担当者の情報は、注文票に登録時点のものでいいのですね?

insert ~ selectを使いましょう。selectで指定する列や定数の並びは、注文tblの列の順番に合わせます。
あるいは、

insert into 注文票tbl(注文id,product_id,...)
select 123,product_id, ~

のように、注文票tblの列とselectで指定する列や定数の並びが一致するように、対応する列を明示指定してください。

<SQL例>
insert into 注文票tbl
select
123, -- 注文id
product_id,    -- 商品マスタの列を書きます。この例では、1001を検索するので、1001でも可
商品名,
`size`,
`color`,
`price`,
salesman_id, -- 担当者マスタの列を書きます。この例では、11を検索するので、11でも可
担当者名
local_area,
global_area,.
100 -- 個数
from 商品マスタ as s,担当者マスタ as t
where product_id=1001 and salesman_id=11;

検索の条件は、ユニークな値であれば、「salesman_id=11」といった条件でなく、「担当者名='山田太郎'」と、名前からsalesman_idを得ることも可能です。

投稿日時 - 2007-10-13 06:54:24

補足

早速のご回答大変助かりました。ありがとうございます。
>MySQLの質問をする場合は、バージョンの明記をお願いします。
申し訳ございません。5.0.41でした。

>担当エリアが変わるのは分かりますが、sizeやcolorも変わるのですか?
>これらが変われば、別のproduct_idになるように感じますが?
おっしゃるとおりです。

>商品や担当者の情報は、注文票に登録時点のものでいいのですね?
全くその通りです。

さらに質問で大変恐縮ですが、よろしくお願いします。
salesman tableは次のようなものです。
salesman_id, local_area_id(担当者が担当する中分類エリア)
local_area tableは次のようなものです。
local_area_id, local_area_name, global_area_id(ローカルエリアに対応するグローバルエリア、たとえば、アジア、ヨーロッパ等の大分類エリア)
このように大分類と中分類のテーブルで正規化されております。
さてこのときに、
担当者(salesman_id)が決まったときに、それに付随する、local_areaはsalesmanのテーブルに対してselectを使えば取得できますが、そのlocal_area_idに対応する、global_area_idを知りたいときは、select local_area_id from salesman where...で絞り込まれた、local_area_idに対して、さらに再帰的に、select global_area_id from local_area where local_area_id=一つ前のselectの結果。
というようなことはどのようにしたらよろしいでしょうか?
さらにむずかしいのは、これで絞り込まれた結果からさらに上の親テーブルに問い合わせるといったことを、2つ3つ上のテーブルに対して反復的に問い合わせしたい場合に応用したいのですが、可能でしょうか?

投稿日時 - 2007-10-13 08:29:32