93.30%

1時間32分

解決済 MySQLで、日付条件での抽出SQL文で困っています。

  • Java

    2890questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • MySQL

    1075questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

2015/12/25 12:57 投稿

White_Rabbit score -1

  • 3

    回答

  • -10

    評価

  • 230

    view

Javaで、MySQLのSQL文を作っていますが、
下記の抽出結果を実現できません。

もしよろしければ、SQL文をご記述頂けると幸いです。


仕様
1.今日以降に予約のある顧客の予約+顧客データーは、全て抽出。※除く、論理削除レコード。
2.今日以降に予約がなく、過去に予約がある顧客の場合は、過去の最大の予約日+予約開始時間のレコードを1つ抽出。※除く、論理削除レコード。
3.過去、未来に予約のない顧客は、顧客情報のみ抽出。


<テーブル例>

■顧客テーブル contomer

※idは、プリマリキ―

id    name    tel                   del 

1           山田                 03-0000-0000                      0
2           田中                 03-0000-0001                      1       <-- 論理削除レコード
3           北村                 03-0000-0002                      0

■予約テーブル  revation

※idは、プリマリキ―

id    costomer_id   revation_date  revation_starttime  del

1            1                                   2015-12-25                       09:00                                             0
2            1                                   2015-12-25                       11:00                                             1    <--論理削除レコード
3            1                                   2015-12-26                       12:00                                             0
4            2                                   2015-12-24                       17:00                                             0
5            2                                   2015-12-24                       13:00

//////////////////////////////////////////////////////////////////////////////////////////////////////////////

■抽出結果

costomer_id  name  tel            revation_date  revation_starttime

1                                    山田            03-0000-0000        2015-12-25                       09:00
1                                    山田            03-0000-0000        2015-12-26                       12:00
2                                    田中            03-0000-0001        2015-12-24                       17:00
3                                    北村            03-0000-0002        null                                    null

以上です。

情報の追加・修正の依頼をする(0)

気になる質問をクリップする

クリップした質問に回答があった場合に通知・メールを受け取ることができます。

クリップした質問はマイページの「クリップ」タブからいつでも見ることができます。

良い質問の評価を上げる

以下のような質問は評価を上げましょう。

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

質問の評価を上げたことを取り消します

0

質問の評価を下げる

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 広告と受け取られるような投稿

評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

評価を下げる理由を選択してください

上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

質問の評価を下げる機能の利用条件

この機能を利用するためには、以下の事項を行う必要があります。

質問の評価を下げたことを取り消します

回答(全3件)

回答の評価を上げる

以下のような回答は評価を上げましょう。

  • 正しい回答
  • わかりやすい回答
  • ためになる回答

評価が高い回答ほどページの上位に表示されます。

2

回答の評価を下げる

以下のような回答は評価を下げられます。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • 不快な投稿

評価を下げる際は理由をコメントしてください。

掲示板はSQLを丸投げする場ではありません。SQL入門から勉強してください。
MySQL初心者入門講座

2015/12/25 13:10 投稿

Orlofsky score 970

コメント(7)

2015/12/25 15:22

えっ、ここのサイト規約には、技術の質問は、初心者は禁止などの規定がありませんが、
Orlofskyさん、ここのサイトの使い方や運営方針を読んでから、書きこみしましょう。
Orlofskyさんには、まだむずかしいのかもしれませんが、社会人になると、それらをまもることを学びますor身に付きます。従って、他の事もそうですが、ルールにそって行動できるよう、且、規則に沿ったことができるようになるとよいでしょう。頑張ってください。

2015/12/25 17:37 編集

横からすみません。
推奨していない質問
https://teratail.com/help/avoid-asking
>コードをください・デバッグしてください等の丸投げの質問

何かを作りたいのでコードを書いてほしい、学校の課題を解いてほしい等の質問は、具体的にプログラミングで困っている質問ではないと考え、推奨していません。
問題や質問は実際に調査や作業に取り組み、具体的なところで生まれると考えるためです。
まずは実際に作業に取り組み、つまづいたところで投稿をしてみてください。

と明記されています。
これは質問フォームにもわかりやすいリンクで記載されています。

質問からは「何をどのように試して、どうつまづいたのか」についての情報がが一切ないので
「丸投げ」と判断されても仕方が無いと思いますよ。

ここのサイトの使い方や運営方針を読んでから、書きこみしましょう。

2015/12/25 17:44

初心者の質問禁止とは書いてありませんが、
「評価を下げる」のリンクにマウスカーソルを合わせると
丸投げはサイトポリシーに反する質問と定義されて非推奨となっていますから
Orlofskyさんの回答はサイトポリシーにのっとったものと判断できますよ?

”規約”の話ならWhite_Rabbitさんの言っていることは間違ってないです。
ただ、他の方々の回答にもあるように”課題の丸投げ”は推奨されていません。
ここはあくまでも問題に対してサポートする場であり、問題の解答をもらう場ではありません。

ご自身で考えて実行してみたSQLを質問の中に記述していればこんなことにならなかったかと思います。

横から失礼しました。

2015/12/26 09:37 編集

はい、ご指摘の通り丸投げにならないように、仕様だけではなく、データのパターン例や抽出結果例をを具体的に明確に記述させていただき、質問内容も明確になるようにしております。

みなさんは、運営様とお話しをしたことがないとかがえておりますがいかがでしょうか?
それで、メニューや記述に書かれていることをそのまま受けて追っていると考えております。
私は、なんども運営様へメールでやり取りしております。
※そこは運営様の記述文の問題ですので、どのように、運営様と質問したかは、あえて書きません(行動力があり本来の運営規約や規則を確認したか、それとも、提示されたも記述不足やミスのことをそのままうのみにするか、それは、人それぞれで、確認時間がない、確認をすることすら思いつかない、確認とかせずに言われたままをうのみにする、その他、色々な方がいらっしゃいます)。

※余談ですがご注意です。ご高齢でしたら、言われたことや書かれていることをうのみにして、振り込み詐欺などに合わないようご注意ください。何が正しいかを確認すべきところへ、勘違いや失敗をする前に、ご確認することをお勧めいたします。

横から失礼しました(私の質問の回答内容とは違い、私の質問自体の議論ですので、そこは運営様へ本質を確認していない人の意見は私の求めている回答の範疇外ですので退任行儀な記述をあえて致します)。

2015/12/26 09:58

丸投げの意味わかって言っていますか?
具体的に「ここのコードがわからない」ではなく、「これを実現するためのコードを教えて」という、結局は「仕事の依頼」ですよね?

どうやら”丸投げ”という意味が分かってないみたいですね。
https://ja.wikipedia.org/wiki/%E4%B8%B8%E6%8A%95%E3%81%92

今回のご質問は記述内容的に
「仕様とデータパターン、想定結果を記述しますのでSQLを提供してください。」
と捉えることができます。
これを”丸投げ”と言わずになんというのでしょうか?

あー、エンジニアは話が通じないってこういうことなのか。

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

回答の評価を上げる

以下のような回答は評価を上げましょう。

  • 正しい回答
  • わかりやすい回答
  • ためになる回答

評価が高い回答ほどページの上位に表示されます。

0

回答の評価を下げる

以下のような回答は評価を下げられます。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • 不快な投稿

評価を下げる際は理由をコメントしてください。

非効率だけど、以下のSQLで実現できるはず、やって見てください。

-- 今日以降に予約のある顧客の予約+顧客データーは、全て抽出。※除く、論理削除レコード。
select 
cust.id,
cust.name,
cust.tel,
re.revation_date,
re.revation_starttime 
from 
contomer cust
left join revation re on re.costomer_id = cust.id and re.del = 0 and re.revation_date > now()
where 
cust.del = 0
and re.costomer_id is not null

-- 今日以降に予約がなく、過去に予約がある顧客の場合は、過去の最大の予約日+予約開始時間のレコードを1つ抽出。※除く、論理削除レコード。 
select 
cust.id,
cust.name,
cust.tel,
T2.revation_date,
T2.revation_starttime 
from 
contomer cust
left join (select 
        re2.revation_date,
        re2.revation_starttime 
       from  
        revation re2
       where re2.id =  
        ( select t.id 
                  from 
                      (select 
                            max(re.revation_date) as revation_date, re.id, re.costomer_id 
            from 
                            revation re 
            where 
                            re.costomer_id = cust.id 
                            and re.del = 0 
                            group by re.id, re.costomer_id ,re.revation_date
            ) t
        )
          ) T2

where 
cust.del = 0
and not exists (select 1 from revation re where re.costomer_id = cust.id and re.del = 0 and re.revation_date > now()) 
and exists (select 1 from revation re where re.costomer_id = cust.id and re.del = 0 and re.revation_date <= now()) 

-- 過去、未来に予約のない顧客は、顧客情報のみ抽出。 
select 
cust.id,
cust.name,
cust.tel
from 
contomer cust
where 
not exists (select 1 from revation re where re.costomer_id = cust.id and re.del = 0) 

2015/12/25 15:17 投稿

YiLi score 46

コメント(4)

2015/12/25 15:24

ご回答ありがとうございます。
心より感謝致しております。ありがとうございます。
大変お手数をおかけし、申し訳ございません。
早速、クエリーを作成して、まずは、DBツール上で、実行してみます。
繰り返しになりますが、お手数をお掛け致しました。

2015/12/25 17:15

条件1のSQLはLEFT JOINしたあとIS NOT NULLの制約をかけるくらいならJOINでよくないですか?
条件2のSQLはLEFT JOINする結合条件がないですし、GROUP BYの項目に主キー?が入っているので集約できていないですよ?

2015/12/25 17:54

>>kutsulog さん
ご指摘有難うございます。
これからちゃんと正しい答えを出せるよう頑張ります。^_^

2015/12/26 09:44 編集

>YiLi様
ご回答ありがとございます。大変感謝しております。
これはこのサイトの方針と個人孤児的な意見でのおねがいですが、YiLi様のように、このサイトでは難易度が難しいや容易などに制限はございません。幅広い層の開発者に公開されているサイトでございます。従いまして、YiLi様のようにこのようにSQL文などのご提示のご回答を頂ける方を、質問者はお待ちしておりますので、間違いなどをお気にせずにご回答頂ければ幸いです。こまっている質問者がいる状況の中で、YuLi様にお時間があるときにしても、どんどん回答して頂ければ幸いです。それが、このサイトの存在意義であり、有効になるかと考えております。※回答欄に、どこかのフルーツ名のような大手の会社のサポートと同じように、何度、色々質問しても、マニュアルのURLを一文で送ってきて自分で調べろ!!で終わらせる会社と同じ体質の回答者がいらしゃる中で、日本大手のサポートのように適切で明確なサポートと同じように、ご回答を頂けるYiLi様はすばらしい方の方と考えます。
そして、それに間違いや、さらに良い方法があるかは、さらに、ここのサイトのコメント機能で、意見をみなさんで出し合って頂いて、良いものになっていければ、なお幸いです。
SQLのご提示とても感謝しております。ありがとうございました。
大変お手数をお掛け致しました。

回答の評価を上げる

以下のような回答は評価を上げましょう。

  • 正しい回答
  • わかりやすい回答
  • ためになる回答

評価が高い回答ほどページの上位に表示されます。

0

回答の評価を下げる

以下のような回答は評価を下げられます。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • 不快な投稿

評価を下げる際は理由をコメントしてください。

仕様1を実現するSQL、仕様2を実現するSQL、仕様3を実現するSQL
それぞれを作ってUNION ALLでつなげば希望の結果が得られるはずです。

そんなに難しくないはずなので頑張ってください。

2015/12/25 13:29 投稿

kutsulog score 531

コメント(1)

2015/12/25 15:32

ありがとうございます。
ここのサイトは、多くの方ご利用されいますので、その方のご回答を待ちつつ、それを基に、SQL文を作成し、自分の勉強へもつなげます。
お手数をおかけしました。

関連した質問

同じタグがついた質問を見る

  • Java

    2890questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • MySQL

    1075questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

関連した質問

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る