こんにちは。現在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に関しては素人同然なので検索の仕方も分からず、ここに頼ってやってきました。どうか、ご教授お願いいたします。
No.1ベストアンサー
- 回答日時:
table1とtable2の対応付けは、opidと同じ値をtable1に持つことで行いましょう。
オプションの種類は、今後、増えることも考えられるのでは?
そう考えると、table1に、各オプションに対応する列を持つのはやめましょう。
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;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript console.logがどうしても2つ機能しないのでアドバイスをくださいお願いします 2 2022/07/07 22:13
- JavaScript JavascriptからSQLへ繋ぎ方が分からない 3 2022/07/07 00:27
- JavaScript 電車の運賃を出すプログラムを作っています。 2 2022/06/22 09:36
- JavaScript sessionStorageを調べています。 1 2023/06/20 12:41
- JavaScript セレクトを全て選択されていないと、文字によるエラーメッセージを表示させるコードを調べています 2 2023/06/22 15:48
- JavaScript セレクトボックスを2つ選択してメッセージなどを表示するには。~運賃検索プログラムを完成させたい~ 1 2022/07/22 11:10
- JavaScript 以前の質問だと、どの条件でも配列が表示されてしまいます。 1 2022/07/09 11:40
- JavaScript セレクトボックスで配列を呼び出したい。 1 2022/07/08 20:14
- JavaScript 中百舌鳥駅と深井駅を入れ替えて選択しても同じ挙動にしたいです。 2 2022/06/24 18:45
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テーブルの集計値を別テーブル...
-
GROUP BYを行った後に結合した...
-
Accessで別テーブルの値をフォ...
-
SELECTで1件のみ取得するには?
-
MERGE文を単体テーブルに対して...
-
Date型にNULLをセットしたい V...
-
レコードセット(ADO.Recordset)...
-
ファイル書込みで一行もしくは...
-
ACCESSの集計クエリで3件ある...
-
Excelで、改行がある場合の条件...
-
SQL文で右から1文字だけ削除す...
-
SQLの書き方(チェックボックス)
-
レコードが存在しなかった場合
-
GROUP BYを使ったSELECT文の総...
-
ADO VBA 実行時エラー3021
-
select insertで複数テーブルか...
-
select句副問い合わせ 値の個...
-
SQL>UPDATEと同時にその件数を...
-
OracleのSQL*PLUSで、デー...
-
ACCESSで大量の更新を行うと「...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessのクエリでフィールドの...
-
テーブルの集計値を別テーブル...
-
ちなみになぜv=(v・e1)e1+(v・e...
-
枝番と主キーがある複数テーブ...
-
ある条件を含まないというクエ...
-
ACCESS VBA レコードセットの参...
-
全パターンを出力するSQL文
-
一方のテーブルではカラム名と...
-
COUNTについて
-
Accessでオートフィルタ...
-
同じ列に2行づつで出力するSQL
-
MYSQLの差集合について
-
MYSQL 異なる DB 結合
-
SQL構文について質問いたします。
-
既存のテーブルに重複フラグを新設
-
GROUP BYを行った後に結合した...
-
Oracleでの文字列連結サイズの上限
-
Accessで別テーブルの値をフォ...
-
SELECTで1件のみ取得するには?
-
SQL文で右から1文字だけ削除す...
おすすめ情報