電子書籍の厳選無料作品が豊富!

こんにちは。現在PHPで業務を行っているものですが、以下のような状況があります。

テーブルが以下のように定義してあります。

table1
+----+------+---------+---------+---------+
| id | name | option1 | option2 | option3 |
+----+------+---------+---------+---------+
| 1 | taro | 1 | 0 | 0 |
| 2 | jiro | 0 | 0 | 0 |
+----+------+---------+---------+---------+

table2
+------+-----------+---------+
| opid | op_charge | op_name |
+------+-----------+---------+
| 1 | 1000 | option1 |
| 2 | 400 | option2 |
| 3 | 800 | option3 |
+------+-----------+---------+

何がしたいかと言うと、上の2つのテーブルを使って、
たとえば、太郎君のidと、太郎君の購入したoption価格(の合計)をSELECT文を使って取得したいのです。
この場合、table1から判断して、太郎君はoption1を購入(1が購入、0が未購入を表しています)しており、その価格はtable2から分かるように1000円なので、同時に取得したい値としては太郎君のIDである1とoption価格である1000の2つです。また、table1でoption2も1になっていたら、太郎君のoption価格合計は400円をたして1400円となります。

ご理解いただけますでしょうか。出来れば結合などを駆使して1SELECT文として設定したいと考えています。そもそもそんなことは不可能ならば、他の方法を考えるしかないのですが、いかがなものでしょう。

なにぶん、SQLに関しては素人同然なので検索の仕方も分からず、ここに頼ってやってきました。どうか、ご教授お願いいたします。

A 回答 (1件)

table1とtable2の対応付けは、opidと同じ値をtable1に持つことで行いましょう。



オプションの種類は、今後、増えることも考えられるのでは?
そう考えると、table1に、各オプションに対応する列を持つのはやめましょう。
    • good
    • 0
この回答へのお礼

chukenkenkouさん、お礼のお返事が送れて申し訳ありませんでした。そして、回答ありがとうございます。

はい、確かにこの2つには対応する値が存在しないので、本来はchukenkenkouさんのおっしゃるとおり、opidをtable1にも持たせるべきなのですよね。

説明不足で申し訳なかったのですが、今回の状況では、自分の立場で勝手にDBの内容を変更することが出来ないのです。本当になんでこんな扱いにくいテーブル構造にしてあるのか自分でも疑問なのですが・・。とにかくそういうことが原因で、このテーブルの状況から何とかしなければならない状況でした。

ちなみに、CASE式を使うことで自分なりにも解決策を見出してみました。他にも同様の苦労をされてる方がいるかもしれないので、一応そのSQL文を掲載して、この質問に対する回答を締め切らせていただこうと思います。chukenkenkouさん、本当にお忙しいところ時間を割いていただきありがとうございました。改めて御礼申し上げます。

↓これがそのSQL文です。

select id, (case when option1='1' then (select op_charge from table2 where op_name='option1') else '0' end) +
(case when option2='1' then (select op_charge from table2 where op_name='option2') else '0' end) +
(case when option3='1' then (select op_charge from table2 where op_name='option3') else '0' end)
from table1;

お礼日時:2008/07/21 13:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!