- ベストアンサー
難しいクエリなので教えてください。
データベース: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 ※予約テーブルに登録されていない場合(山田五郎)も合わせて 抽出 すみませんが、上記のクエリについてどなたか 教えてください。お願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
これって2007年のデータではないのですか? 最新の予約日付が今日まで1ヶ月以上でてない人・・・ と好意的に解釈すれば SELECT `顧客テーブル`.`顧客番号`,`氏名`,MAX(`予約日付`) AS `最近の予約` FROM `顧客テーブル` LEFT JOIN `予約テーブル` USING(`顧客番号`) GROUP BY `顧客番号` HAVING `最近の予約` IS NULL OR `最近の予約` < CURDATE() - INTERVAL 1 MONTH となります。 もちろん例示された予約日付は2008年になっているので、 これをやってもNULLの山田五郎しかヒットしませんけどね。
その他の回答 (3)
- chukenkenkou
- ベストアンサー率43% (833/1926)
サブクエリを使えないということは、MySQL 4.0なのですね? 単にバージョン4というと、MySQL 4.xと解釈される場合もあるので、質問する場合は明示するようにしてください。 「1ヶ月予約していない人」との条件ですが、どういう意味でしょうか? 示されたデータ例が、来年(2008年)であり、何と何を比較して、1ヵ月以上なのかが分かりません。 ・現在日付と比較して、1ヵ月以上開いている。 ・複数の予約がある場合、予約日の間隔が1ヵ月以上開いている。 など、いろいろ解釈ができてしまいます。 表のデータ例とともに、抽出したいデータ、抽出不要のデータの例を明示してください。
お礼
申し訳ありません。2007年データでした。
- yambejp
- ベストアンサー率51% (3827/7415)
普通にLEFT JOINしてやればよいのでは? SELECT `顧客テーブル`.`顧客番号`,`氏名`,`予約日付` FROM `顧客テーブル` LEFT JOIN `予約テーブル` USING(`顧客番号`)
補足
期間の指定はどうすればいいのでしょうか・・・。
- dais4x
- ベストアンサー率12% (42/332)
MYSQLのバージョン4が、どんなものか知りませんが、、 select A.顧客番号,A.氏名 from 顧客テーブル A where A.顧客番号 not in( select B.顧客番号 from 予約テーブル B where MAX(B.予約日付) > addmonth(today(),-1) group by B.顧客番号 ); こんな感じで、いけるのでは?
補足
すみません、バージョンが古くて、 サブクエリは使用できないんです。
お礼
申し訳ありません。2007年データでした。 上記クエリにて解決致しました。 どうもありがとうございます。