• ベストアンサー

難しいクエリなので教えてください。

データベース:MYSQLのバージョン4です。 1ヶ月予約していない人を抽出せよ、というクエリです。 テーブルは 顧客テーブル(t_customer)と予約テーブル(t_yoyaku)です。 顧客テーブルのカラムは、顧客番号(no)、氏名(name)です。 予約テーブルのカラムは、顧客番号(no)と予約日付(day)です。 以下のようにレコードが登録されています。 顧客テーブル 顧客番号 氏名 1  鈴木太郎 2  佐藤一朗 3  高橋次郎 4  山田五郎 予約テーブル 顧客番号 予約日付 1  2008-4-10 1  2008-5-11 1  2008-6-12 1  2008-7-10 2  2008-5-12 2  2008-6-10 3  2008-6-11 3  2008-8-12 ※予約テーブルに登録されていない場合(山田五郎)も合わせて 抽出 すみませんが、上記のクエリについてどなたか 教えてください。お願いします。

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

これって2007年のデータではないのですか? 最新の予約日付が今日まで1ヶ月以上でてない人・・・ と好意的に解釈すれば SELECT `顧客テーブル`.`顧客番号`,`氏名`,MAX(`予約日付`) AS `最近の予約` FROM `顧客テーブル` LEFT JOIN `予約テーブル` USING(`顧客番号`) GROUP BY `顧客番号` HAVING `最近の予約` IS NULL OR `最近の予約` < CURDATE() - INTERVAL 1 MONTH となります。 もちろん例示された予約日付は2008年になっているので、 これをやってもNULLの山田五郎しかヒットしませんけどね。

kadai1800
質問者

お礼

申し訳ありません。2007年データでした。 上記クエリにて解決致しました。 どうもありがとうございます。

その他の回答 (3)

回答No.3

サブクエリを使えないということは、MySQL 4.0なのですね? 単にバージョン4というと、MySQL 4.xと解釈される場合もあるので、質問する場合は明示するようにしてください。 「1ヶ月予約していない人」との条件ですが、どういう意味でしょうか? 示されたデータ例が、来年(2008年)であり、何と何を比較して、1ヵ月以上なのかが分かりません。 ・現在日付と比較して、1ヵ月以上開いている。 ・複数の予約がある場合、予約日の間隔が1ヵ月以上開いている。 など、いろいろ解釈ができてしまいます。 表のデータ例とともに、抽出したいデータ、抽出不要のデータの例を明示してください。

kadai1800
質問者

お礼

申し訳ありません。2007年データでした。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

普通にLEFT JOINしてやればよいのでは? SELECT `顧客テーブル`.`顧客番号`,`氏名`,`予約日付` FROM `顧客テーブル` LEFT JOIN `予約テーブル` USING(`顧客番号`)

kadai1800
質問者

補足

期間の指定はどうすればいいのでしょうか・・・。

  • dais4x
  • ベストアンサー率12% (42/332)
回答No.1

MYSQLのバージョン4が、どんなものか知りませんが、、 select A.顧客番号,A.氏名 from 顧客テーブル A where A.顧客番号 not in( select B.顧客番号 from 予約テーブル B where MAX(B.予約日付) > addmonth(today(),-1) group by B.顧客番号 ); こんな感じで、いけるのでは?

kadai1800
質問者

補足

すみません、バージョンが古くて、 サブクエリは使用できないんです。

関連するQ&A