- ベストアンサー
MySQLの条件分岐: if文とcase文の使い方
- MySQL初心者の方に向けて、複数条件の指定方法について解説します。
- StaffテーブルとSch1テーブル、Sch2テーブルを活用してスケジュールの仕組みを考えます。
- 日付出勤と曜日出勤の優先順位を考慮し、出力する方法についてもご紹介します。
- みんなの回答 (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万ちょいなので 対して重い処理にはならない
お礼
temporary table初めて知りました。 ちょうどこれから画像プレビュー機能を作りたいので これだと非常に便利ですね 本当にありがとうございました。