dポイントプレゼントキャンペーン実施中!

mysql初心者です。
3つのテーブルでスケジュールの仕組みを考えていますが

Staff→スタッフデータ
id  name
1   田中

Sch1→日付出勤
id  start_time  end_time  date  flg
1   9:00   22:30   2014-03-17   1


Sch2→曜日出勤
id  start_time  end_time  dateW
1   9:00   22:30   1
※dateWは曜日(0~6)

日付出勤優先なので、なければ曜日出勤を出力します。
たとえば、
田中さん
(1)日付登録:2014-03-17(月) 09:00-18:00
(2)曜日登録:1(月) 10:00-19:00
(3)曜日登録:2(火) 09:00-18:00


PHP側でやるなら、
for (一週間分回す) {
if (Sch1[date]) {
日付設定出力
}else{
曜日設定出力
}
}
全出力した(日付、曜日)データを一個の配列に入れて、start_timeでソートするかで出力する。。

Mysqlのif文かcase文分でどう書いたらいいですか?
説明が下手ですが、
どなたかご存知の方がいらっしゃれば是非、ご教授ください。

A 回答 (1件)

こういうのは本来日付がずらーっとならんだカレンダーテーブルをつくって


それにinsert していくのが普通

また曜日は月曜日=0とした0~6(WEEKDAY関数)もしくは日曜日=1とした1~7
(DAYOFWEEK)が扱いやすい

かりにこんな処理にすると
//元データ
create table staff(uid int,uname varchar(20));
insert into staff values(1,'田中');

create table sch1(uid int,start_time time,end_time time,d date,flg tinyint) ;
insert into sch1 values(1,'9:00','22:30','2014-03-17',1),(1,'9:00','13:00','2014-03-18',1),(1,'9:00','20:00','2014-03-19',1);

create table sch2(uid int,start_time time,end_time time,dateW int,unique(uid,dateW));
insert into sch2 values(1,'9:00','22:30',0),(1,'10:00','11:30',1),(1,'13:00','15:30',3);

カレンダーテーブルがない場合はテンポラリで無理やりつくる
こんな感じで3/17、18、20、21をそれぞれとると
3/17は両方ヒット、3/18は日付でヒット、3/20は曜日でヒットし
3/21はヒットしないことがわかる。

create temporary table sch3 select '2014-03-17' as d;
select * from sch3
left join sch1 on sch3.d=sch1.d
left join sch2 on weekday(sch3.d)=sch2.dateW;

create temporary table sch3 select '2014-03-19' as d;
select * from sch3
left join sch1 on sch3.d=sch1.d
left join sch2 on weekday(sch3.d)=sch2.dateW;

create temporary table sch3 select '2014-03-20' as d;
select * from sch3
left join sch1 on sch3.d=sch1.d
left join sch2 on weekday(sch3.d)=sch2.dateW;

create temporary table sch3 select '2014-03-21' as d;
select * from sch3
left join sch1 on sch3.d=sch1.d
left join sch2 on weekday(sch3.d)=sch2.dateW;

これをまとめて、こんな感じ
create temporary table sch3 select '2014-03-17' as d;
select coalesce(sch1.start_time,sch2.start_time) as s
,coalesce(sch1.end_time,sch2.end_time) as e
from sch3
left join sch1 on sch3.d=sch1.d
left join sch2 on weekday(sch3.d)=sch2.dateW;

いちいちテンポラリテーブルを作るのが面倒であれば最初に書いた通り
10年分くらいので日付を並べたカレンダーを最初につくっておいて
where カレンダ.d='指定日'
的な処理をすればいい

仮に10年分日付つくっても所詮3600件程度、100年分作っても3万ちょいなので
対して重い処理にはならない
    • good
    • 0
この回答へのお礼

temporary table初めて知りました。
ちょうどこれから画像プレビュー機能を作りたいので
これだと非常に便利ですね
本当にありがとうございました。

お礼日時:2014/03/18 13:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!