出席者、欠席者、未登録者の一覧を出したいのですが、SQL文に困り投稿しました。
スケジュールと出欠登録とユーザーの各テーブルがDB内に入っています。
スケジュールのテーブルの中には
schedule
|id|date|naiyou|
|1|2012-07-10|A|
|2|2012-08-10|B|
出欠登録のテーブルの中には
entry
|id|schedule_id|member_id|entry|
|1|1|1|1|
|2|1|2|2|
|3|2|3|1|
|4|2|2|1|
メンバーのテーブルの中には
member
|id|name|registdate|
|1|AAA|2012-06-10|
|2|BBB|2012-07-01|
|3|CCC|2012-07-30|
とあった場合
出席者、欠席者の一覧は簡単に出せるのですが、未登録者の一覧が出せず困っています。
また、出席者や欠席者、未登録者の一覧はそのスケジュールIDごとに分かれ一覧をだしています。
例:
スケジュールid1の場合、
出席者 AAA
欠席者 BBB
未登録者はそのスケジュールにまだ出欠登録をされていなければ一覧表示し、
出欠登録をされたら未登録者から消え、出席者か欠席者に表示される。
また、スケジュールの日程(schedule.date)より前にメンバーの登録(member.registdate)をした人のみ一覧表示する。
スケジュールid1の場合、
出席者 AAA
欠席者 BBB
↑CCCは未登録者だが、schedule.dateより後にメンバー登録をしているため表示しない
スケジュールid2の場合、
出席者 CCC、BBB
未登録者 AAA
以上の内容を踏まえて下記のように書いているのですが、わからなくなってしまいました。
どなたかおわかりの方がいらっしゃいましたらご教示お願いします。
select *
from schedule
left join entry on schedule.id = entry.schedule_id
right join member on entry.member_id = member.id
where entry.`schedule_id` = 2 AND schedule.date >= member.registdate
上記の書き方では shedule.id 2に出欠登録した人がでてきて、未登録者がでてこないです。
未登録者の一覧を出す方法をお願いします。
No.2ベストアンサー
- 回答日時:
ひさしぶりです
お盆休みのバタバタで回答できず、すみません。
>できればスケジュール日程より前にメンバー登録した人を表示させたいです
整理しましょう。
出席・欠席を表明している人はメンバー登録しているということで前述の
SQLで必要十分であるということでよろしいですね?
そうなると残るは未登録者についてですが、ちょっと工夫すればよさそうです
わかりやすくするためにまず、memberにDDD、EEEを追加して試してみます
insert into member values(1,'AAA','2012-06-10'),(2,'BBB','2012-07-01'),(3,'CCC','2012-07-30'),(4,'DDD','2012-01-01'),(5,'EEE','2012-12-31');
以下、もうすこし効率的な書き方がありそうなきがしますが
とりあえずこんな感じでいけるはずです。
//スケジュール1の未登録者
select name from member inner join (select 1 as sid) as sub on 1
left join entry on member_id=mid and schedule_id=sid
inner join schedule on schedule.sid=sub.sid and d>=registdate
where schedule_id is null;
→DDDが表示されます
//スケジュール2の未登録者
select name from member inner join (select 2 as sid) as sub on 1
left join entry on member_id=mid and schedule_id=sid
inner join schedule on schedule.sid=sub.sid and d>=registdate
where schedule_id is null;
→AAAとDDDが表示されます
※注:(select 2 as sid)の数字にsidにあたる数字を入れてください
お返事が遅くなり申し訳ありません。
知らないSQL文がでてきているので調べながら確認しておりました。
上記の内容でできることが確認できました。
本当に有難うございました。
No.1
- 回答日時:
ちょっとわかりづらいのでカラム名を調整してあります
create table schedule(sid int,d date,naiyou varchar(10));
insert into schedule values(1,'2012-07-10','A'),(2,'2012-08-10','B');
create table entry(eid int,schedule_id int,member_id int,entry int);
insert into entry values(1,1,1,1),(2,1,2,2),(3,2,3,1),(4,2,2,1);
create table member(mid int,name varchar(10),registdate date);
insert into member values(1,'AAA','2012-06-10'),(2,'BBB','2012-07-01'),(3,'CCC','2012-07-30');
//スケジュール1
select name from member inner join entry on member_id=mid and schedule_id=1 and entry=1;
select name from member inner join entry on member_id=mid and schedule_id=1 and entry=2;
select name from member left join entry on member_id=mid and schedule_id=1 where schedule_id is null;
//スケジュール2
select name from member inner join entry on member_id=mid and schedule_id=2 and entry=1;
select name from member inner join entry on member_id=mid and schedule_id=2 and entry=2;
select name from member left join entry on member_id=mid and schedule_id=2 where schedule_id is null;
ご回答有難う御座います。
解りやすいselect文有難う御座います。
ただ1点なのですが、未登録者のselect文ですが、このままですと
スケジュールの日程より後にメンバー登録した人まで表示されてしまいます。
上記の内容は普通では特に気にしないとこなのですが、メンバーに過去のスケジュールの出席者、欠席者、未登録者を見せるため必要になってしまいます。
できればスケジュール日程より前にメンバー登録した人を表示させたいです(一番目的としている)。
よろしければお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL SQLで日付別のIDを生成するには 3 2022/10/09 10:34
- Access(アクセス) Dlookupにエラーがでてしまう 1 2022/10/31 14:35
- SQL Server ACCESSで3ファイルを結合して、表を作成するやり方を教えて下さい。 17 2022/08/15 20:34
- SQL Server ACCESSで表が作りたく、そのためのSQL文や設定方法を教えてください。 1 2022/08/15 12:28
- 教えて!goo 【朗報】ブロック機能Updateに伴い利用者をブロックすると対象者の質問も非表示になります。類似質問 12 2022/06/22 22:43
- ヤフオク! ヤフオクで同一人物かと思う新規IDに悪戯入札の被害を受けています。終了1秒前に入札し出品者側から入札 2 2022/05/08 21:50
- ポイントサービス・マイル ポンタポイントの登録の仕方を教えてください 1 2023/01/19 22:56
- gooブログ Blogの使い方(ブログ・ユーザ設定について) 1 2022/04/23 12:40
- SQL Server ACCESSで複数テーブルを結合して、リストを作る方法を教えてください。 2 2022/08/12 19:32
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MAX関数を使ってからLEFT JOIN...
-
読み込んだQRコードをフォーム...
-
HTMLタグに複数のクラスを設定...
-
HTMLとJavaScriptで作ったタイ...
-
<div id="blank">内の<a>タグ群...
-
折りたたみ部分にアンカーでリ...
-
テキストボックスに入力された...
-
jQueryで特定id以外の下にある...
-
iframe内のリンクが飛ばないの...
-
同一ページ内リンクで、クロス...
-
配列で特定キーが同じ値だった...
-
createElementで作成した要素を...
-
クリックで色変更後に既に変更...
-
マウスポインタが砂時計に
-
javascriptテキストBOX色を元に...
-
createElementが一瞬で消えてし...
-
表示・非表示のスクリプトで、...
-
変数内容をHTML内で表示する方法
-
指定したパスが現URLに含まれて...
-
innerHTMLの初期値
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
MAX関数を使ってからLEFT JOIN...
-
javascriptテキストBOX色を元に...
-
読み込んだQRコードをフォーム...
-
createElementで作成した要素を...
-
removeEventListenerについて
-
IFRAMEの表示/非表示を切り替え...
-
タブで開いてさらにタブ内をア...
-
変数名をどのようにつけるのが...
-
クリックで色変更後に既に変更...
-
表示・非表示のスクリプトで、...
-
HTMLとJavaScriptで作ったタイ...
-
console.log結果をhtmlで表示し...
-
jQueryでクリックされた要素のi...
-
HTMLタグに複数のクラスを設定...
-
指定したパスが現URLに含まれて...
-
iframe内のリンクが飛ばないの...
-
背景色を透明化
-
テキストエリア内の一部の文字...
-
変数内容をHTML内で表示する方法
-
classの中の<a>タグにidを追加
おすすめ情報