みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

データベース: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

※予約テーブルに登録されていない場合(山田五郎)も合わせて
抽出

すみませんが、上記のクエリについてどなたか
教えてください。お願いします。

投稿日時 - 2007-08-13 20:27:48

QNo.3252375

すぐに回答ほしいです

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

これって2007年のデータではないのですか?
最新の予約日付が今日まで1ヶ月以上でてない人・・・
と好意的に解釈すれば

SELECT `顧客テーブル`.`顧客番号`,`氏名`,MAX(`予約日付`) AS `最近の予約`
FROM `顧客テーブル`
LEFT JOIN `予約テーブル` USING(`顧客番号`)
GROUP BY `顧客番号`
HAVING `最近の予約` IS NULL
OR `最近の予約` < CURDATE() - INTERVAL 1 MONTH

となります。
もちろん例示された予約日付は2008年になっているので、
これをやってもNULLの山田五郎しかヒットしませんけどね。

投稿日時 - 2007-08-14 00:39:04

お礼

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

投稿日時 - 2007-08-14 15:17:57

ANo.4

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

サブクエリを使えないということは、MySQL 4.0なのですね?

単にバージョン4というと、MySQL 4.xと解釈される場合もあるので、質問する場合は明示するようにしてください。

「1ヶ月予約していない人」との条件ですが、どういう意味でしょうか?
示されたデータ例が、来年(2008年)であり、何と何を比較して、1ヵ月以上なのかが分かりません。

・現在日付と比較して、1ヵ月以上開いている。
・複数の予約がある場合、予約日の間隔が1ヵ月以上開いている。

など、いろいろ解釈ができてしまいます。

表のデータ例とともに、抽出したいデータ、抽出不要のデータの例を明示してください。

投稿日時 - 2007-08-13 23:26:13

お礼

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

投稿日時 - 2007-08-14 15:17:05

ANo.2

普通にLEFT JOINしてやればよいのでは?

SELECT `顧客テーブル`.`顧客番号`,`氏名`,`予約日付`
FROM `顧客テーブル`
LEFT JOIN `予約テーブル` USING(`顧客番号`)

投稿日時 - 2007-08-13 21:18:11

補足

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

投稿日時 - 2007-08-13 23:13:17

ANo.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.顧客番号
);

こんな感じで、いけるのでは?

投稿日時 - 2007-08-13 20:38:42

補足

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

投稿日時 - 2007-08-13 20:50:57

あなたにオススメの質問