• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SQLの副問い合わせ)

SQLの副問い合わせによる予約リストの出力方法

このQ&Aのポイント
  • MySQLを使って予約の仕組みを作る際に、SQLの副問い合わせを使って予約リストを出力する方法について質問します。
  • 具体的には、2つのテーブルをジョインして特定の日の予約時間の一覧を「リスト」の形式で出力したいと考えています。
  • これまでいろいろなSQLを試してみましたがうまくいかず、どのようなSQLを組み立てれば良いかわかりません。ご指導いただけると助かります。

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

  • ベストアンサー
回答No.2

こんにちわ。 以下のようなテーブル構造とデータの場合で回答させていただきます。 コンソールからのコピペのため読みにくいところはご容赦ください。 【データ部分】 mysql> select * from frame; +----------+--------------+--------------+ | frame_id | reserve_date | reserve_time | +----------+--------------+--------------+ | 1 | 2015-07-15 | 10:20:00 | | 2 | 2015-07-15 | 10:30:00 | | 3 | 2015-07-15 | 10:40:00 | | 4 | 2015-07-15 | 11:40:00 | | 5 | 2015-07-15 | 12:00:00 | +----------+--------------+--------------+ mysql> select * from reserve; +------------+----------+---------------+--------+ | reserve_id | frame_id | customer_name | number | +------------+----------+---------------+--------+ | 1 | 1 | Tanaka | 1 | | 2 | 1 | Yoshida | 2 | | 3 | 1 | Yamada | 3 | | 4 | 1 | Ota | 4 | | 5 | 3 | Huguta | 1 | | 6 | 3 | Tanaka | 2 | | 7 | 3 | tokorozawa | 3 | +------------+----------+---------------+--------+ 【回答部分】 mysql> select A.frame_id,A.reserve_time,count(B.reserve_id) as count from frame -> as A left join reserve as B on A.frame_id = B.frame_id -> where A.reserve_date = "2015-07-15" -> group by A.reserve_time; +----------+--------------+-------+ | frame_id | reserve_time | count | +----------+--------------+-------+ | 1 | 10:20:00 | 4 | | 2 | 10:30:00 | 0 | | 3 | 10:40:00 | 3 | | 4 | 11:40:00 | 0 | | 5 | 12:00:00 | 0 | +----------+--------------+-------+ 上記でcoonyanp様の求めるデータが取得できてるかなと思うのですが、いかがでしょうか? ご参考になれば幸いです。

coonyanp
質問者

お礼

machi_mac123 さん、回答ありがとうございました。 教えて頂いたSQLでできました。 「left join」は見たこともなかったんで、1時間ほどかかってググって勉強してました。 「外部結合」といって、どちらか表を優先的に出力して、付加的にJOIN先のテーブルの情報(この場合は「count(tbl_reserve.reserveId)」)を出力するのですね。 普通のテーブルJOINは条件に合ったものしか抽出しないんですね。 何気なくいつも使ってましたが、考えてみればそうですね。 半分あきらめかけて、一行一行抽出して、最後にすべての行を結合して組み立てることを考えて取り掛かったんですが、これはこれでやたらに難しく、どうしようか困ってたところだったので、ほんとうに助かりました。 感謝の気持ちでいっぱいです。 ほんとうにありがとうございました

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.1

こんにちは。 実際に動かして試していないので、そのまま動かなかったらスミマセン。 SELECT frameId, reserveTime, count(*) as rCount FROM tbl_frame, tbl_reserve WHERE tbl_reserve.reserveDate = '2015-07-15' AND tbl_frame.frameId = tbl_reserve.frameId GROUP BY tbl_frame.frameId ,tbl_frame.reserveTime 予約日はWHERE句で条件指定されているので、予約時間でグルーピングしてカウントするとよいと思います。 ご参考になれば幸いです。

coonyanp
質問者

お礼

tomato_teaさん,さっそくの回答ありがとうございました。 これでお昼ごはん食べに行ける、と思って以下のSQLを動かしてみました。 SELECT tbl_frame.frameId, reserveTime, count(*) as rCount FROM tbl_frame, tbl_reserve WHERE tbl_frame.reserveDate = '2015-07-15' AND tbl_frame.frameId = tbl_reserve.frameId GROUP BY tbl_frame.frameId ,tbl_frame.reserveTime 検索できた! と思ったんですが、予約件数が「1」以上のものしか出力されず、予約件数が「0」のワクは出力されません。ガックシ。 予約件数が「0」のワクも含めてすべて10件のワクを出力するにはどうしたらいいでしょうか。 というか、1行ずつ(1ワクずつ)出力してつなげるしかないでしょうか。 よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • サブクエリを利用したSQL文から複数の抽出条件

    例えば、以下のようなサブクエリを利用したSQL文があります。 SELECT table_a.* FROM table_a LEFT JOIN (SELECT table_b.* FROM table_b LEFT JOIN table_c ON (table_b.id = table_c.bid) WHERE table_b.type='1') AS tbl ON (table_a.id = tbl.aid) このSQL文にWHERE句で条件を指定したいのですが、サブクエリで指定しているtblテーブルのvalueフィールドが「1」と「20」のものを抽出したいと思います。 WHERE (tbl.value='1' AND tbl.value='20') としても結果が帰って来ません。 これは、WHEREする条件の数だけ、サブクエリでテーブルを作って条件を指定するのでしょうか? 効率が悪そうなので、他の方法があるのではと思いご質問させて頂きました。 お分かりになる方がいれば、よろしくお願いします。

  • ACCESSのSQLの書き方

    ACCESSでのSQL文の書き方を教えてください。 テーブルtbl_Aとテーブルtbl_Bがあり, tbl_Aで得られた数値とtbl_Bで得られた数値を加えたものを結果として表示します。 どう書けばよろしいのでしょうか。どうしてもエラーになってしまいます。 イメージとしてはこんな感じです。 select (select ~~ from tbl_A where ~~)+(select ~~ from tbl_B where ~~) (もしoracleならば,「from dual」というのを最後に付けるんですが。)

  • oracleからSQL Serverへの移行

    oracleからSQL Serverへ移行することになったのですが、副問い合わせで定義したテーブル同士を外部結合するSQL構文が、うまく実現できず、ご教授して頂きたくよろしくお願いします。 下記、oracle 構文をSQL Server構文へ書き換えたい。 select * from (select cal1,cal2,cal3 from tbl1,tbl2 where cal1 >100) aaa, (select cal1,cal2,cal3 from tbl1,tbl2 where cal1 <=100) bbb, tbl3 where aaa.cal1 = bbb.cal1(+) and aaa.cal2 = bbb.cal2(+) and aaa.cal3 = bbb.cal3(+) and aaa.cal1 = tbl3.cal1 よろしくお願いします。

  • Access、SQLステートメントでの仮テーブルの作り方について

    AccessのSQLステートメントで仮テーブルを使ったSQLを作りたいのですが、構文の書き方がよくわかりません。 わからないなりに以下のようなSQL文を作ってみたのですが、 SELECT TBL.NO FROM [SELECT NO FROM ○○TBL WHERE △△="△△" GROUP BY NO HAVING (Mid(××,2,1)="K") ]. AS TBL; (本当はWHEREのあとにANDがたくさんあります) 実行すると、 「パラメータや別名が正しいこと、無効な文字や区切り記号が含まれていないこと、または名前が長すぎないことを確認してください。」 とメッセージが出ます。 仮テーブルに長いSELECT文をつかうことはできないのでしょうか? ちなみに環境はOS:Win2000+Access2000です。 どなたかアドバイスください。 よろしくお願いします。

  • SQL 副問い合わせ

    以下のaテーブルのcardidと、bテーブルのnoが同じで、 かつ、bテーブルのryodtmが前月のデータを抽出する以下のsqlを、 aテーブルのcardidが、bテーブルのnoと同じで、かつ、ryodtmが前月分、 または、cテーブルのchangcardと同じで、かつ、ryodtmが前月分のを抽出する場合、 どうすればいいでしょうか? select * from a where cardid in ( select distinct(no) from b where kdncresbt ='1' and ryodtm >= TO_CHAR(ADD_MONTHS(TRNC(SYSDATE,'MONTH'), -1),'YYYYMM' ) || '01' and ryodtm < TO_CHAR(SYSDATE,'YYYYMM') || '01' )

  • 副問い合わせで複数の列を返す

    こんにちは、Makotoと申します。 SQLの副問い合わせで質問があるのですが、 現在のSQLは CREATE OR REPLACE VIEW VIWTEST AS SELECT KOMOKU1, KOMOKU2 (SELECT SUM(KOMOKU3) FROM TBL WHERE A = 1 (SELECT SUM(KOMOKU4) FROM TBL WHERE A = 1 (SELECT SUM(KOMOKU5) FROM TBL WHERE A = 1 FROM M_TBL; という感じのSQLなのですが、副問い合わせの所 が見ているテーブルも条件も一緒なので1つにまとめたいのですが、うまくいきません。CURSORという関数があったのですが、VIEWでは使用できませんでした。なにかよい方法はないでしょうか? 開発環境は oracle 9i(AIX) pro*C/C++ でおこなっています。

  • オラクル結合SQL

    こんばんわ。オラクル初心者です。 オラクル9.1で、下記のようにtable1とtable2を結合して、view1(oracleビュー) を作成したいのですが、どのようなSQLがよいでしょうか。 なかなかうまい方法がなくてこまっています。 table1 no 項目 その他 その他1 1   1 1  2 1  3 .....省略 table2 no 項目 種別 結果 1  1  01  3 1  1  02   8 1  1   03  7 1  2  01  9 1  2   02   6 1  2  03  2 1  3  01   1 ...... view1 良い例 no 項目 結果1 結果2 結果3 1   1   3   8   7    ←種別01 02 03を順にいれる 1   2  9   6  2 1  3  1............ select table1.no,table1.項目,・・・ from table1,table2 where table1.no = table2.no and table1.項目 = table2.項目 ↑おおよそこのような感じになるとは思ってます。 何とか頑張ったのですが、下記のようになってしまうことが 多かったです・・・。どこかSQLがわるいようです。 view1 悪い例 no 項目 結果1 結果2 結果3 1  1   3   8  7 1  1   3   8  7 1  1   3   8  7 1   2  9  6  2 1   2  9  6  2 1   2  9  6  2 1   3  1............ もしご存知の方いらっしゃいましたら、助かります。よろしくお願いいたします。

  • PL/SQLのDELETE文について

    PL/SQLでDELETE文を書こうとしているのですが、 文法がわかりません。。。 分かる方がおられましたら、教えてくださいm(_ _)m 今、TABLE1を削除したいのですが、条件がいろいろあって、 以下のように書いてみたのですがダメでした。 こういう書き方は、できないんでしょうか・・・。 削除条件は、TABLE2に存在し、かつ、TABLE2のTENSUが0のもので、 TABLE3が存在しないものです。 DELETE TABLE1 FROM TABLE1 ,TABLE2 ,TABLE3 WHERE TABLE1.ID = TABLE2.ID AND TABLE2.TENSU = 0 AND Not Exists (SELECT TABLE3.ID FROM TABLE3 WHERE TABLE3.ID = TABLE2.ID) 説明が下手なので、うまく、伝わっているか、心配なのですが・・・、 よろしくお願いします。

  • UNION ALLしたテーブルを個別に並べ変え

    table1、table2、table3というテーブルがあり このそれぞれをidというカラムで並び替えたものを結合するので考えました。 SELECT * FROM `table1` UNION ALL SELECT * FROM `table2` UNION ALL SELECT * FROM `table3` ORDER BY `id` にすると全てを結合したものを並び替えるので SELECT *, '1' AS tbl FROM `table1` UNION ALL SELECT *, '2' AS tbl FROM `table2` UNION ALL SELECT *, '3' AS tbl FROM `table3` ORDER BY `tbl`,`id` という風に書いてみました、結果としてはよさそうですが 方法としては間違ってないでしょうか? 他にいい方法があればアドバイスをお願いします。

  • SQLについて

    こんにちは、honiyonです。  良い質問タイトルが思いつきませんでした...(^^;  2つのテーブルがあります。(仮定です)   ・オーナーの情報テーブル(owner)   ・オーナーの車の情報テーブル(car)  この2つのテーブルを利用して「男性の人で、黒い車に乗ってる人の車種名」を検索しようとしました。  これを1つのSQLで   SELECT car.name FROM owner,car WHERE (owner.no=car.ownerno) and (car.color='black') and (owner.sex='MAN');  とか、   SELECT car.name FROM (SELECT * FROM owner WHERE (owner.sex='MAN')) AS O2, (SELECT * FROM car WHERE (car.color='black')) AS C2 WHERE (owner.no=car.ownerno);  とかやってみましたが、涙が出るほど遅いです。  しかし   SELECT * INTO TABLE owner_tmp FROM (SELECT * FROM owner WHERE owner.sex='MAN'); SELECT * INTO TABLE car_tmp FROM (SELECT * FROM car WHERE car.color='black'); SELECT car_tmp.name FROM (owner_tmp.no=car_tmp.ownerno);  とすると超高速です。  なんとかテンポラリを作らず、出来れば1つのSQL文で高速に冒頭の処理を行いたいのですが、良い方法はないでしょうか。 是非お知恵を貸してください。  宜しくお願いします(.. #データベースはPostgreSQL 7.2.3です。