- ベストアンサー
PHPでスケジュールの出席者、欠席者、未登録者の一覧を取得する方法
- PHPを使用して、スケジュールの出席者、欠席者、未登録者の一覧を取得する方法を説明します。
- スケジュール、出欠登録、メンバーのテーブルを使用し、該当するスケジュールの出席者、欠席者、未登録者を取得します。
- 特定のスケジュールに対して、出欠登録がされていないメンバーを未登録者として表示し、出欠登録がされたら未登録者から削除されます。また、スケジュールの日程より前にメンバーが登録されている場合のみ、一覧に表示されます。
- みんなの回答 (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にあたる数字を入れてください
その他の回答 (1)
- yambejp
- ベストアンサー率51% (3827/7415)
ちょっとわかりづらいのでカラム名を調整してあります 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文ですが、このままですと スケジュールの日程より後にメンバー登録した人まで表示されてしまいます。 上記の内容は普通では特に気にしないとこなのですが、メンバーに過去のスケジュールの出席者、欠席者、未登録者を見せるため必要になってしまいます。 できればスケジュール日程より前にメンバー登録した人を表示させたいです(一番目的としている)。 よろしければお願いします。
お礼
お返事が遅くなり申し訳ありません。 知らないSQL文がでてきているので調べながら確認しておりました。 上記の内容でできることが確認できました。 本当に有難うございました。