
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文分でどう書いたらいいですか?
説明が下手ですが、
どなたかご存知の方がいらっしゃれば是非、ご教授ください。
No.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初めて知りました。
ちょうどこれから画像プレビュー機能を作りたいので
これだと非常に便利ですね
本当にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ワークシートチェンジで曜日を表示する方法 1 2023/03/04 21:51
- Excel(エクセル) 出勤簿の土、日、休日に色付けできない 2 2022/08/04 20:10
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Visual Basic(VBA) VBAで時間(00:00形式)を積算(足し算)したい 1 2022/11/15 17:04
- Excel(エクセル) エクセルVBA オートフィルタでの絞り込みと並び替えについて 1 2023/07/08 13:08
- Visual Basic(VBA) VBA 毎日取得するデータを順番に反映していく方法 6 2023/08/26 16:22
- Visual Basic(VBA) VBAで日付入力しているのですが 4 2023/03/02 11:25
- Excel(エクセル) エクセルの条件付き書式について エクセルでカレンダーを作りました。縦に日付が並んでいて、横にスケジュ 3 2022/10/10 15:32
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Visual Basic(VBA) VBAの繰り返し処理について教えてください。 3 2022/08/02 13:21
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
下記の問合せを行うクエリを、 ...
-
複数のテーブルから値を合計出...
-
DISTINCTROWについてです。
-
【ExcelVBA】入力された日付か...
-
日付検索で0001-01-01 00:00:00...
-
SQLローダーCSV取込で、囲み文...
-
単一グループのグループ関数で...
-
テーブルの最後(最新)のレコー...
-
where句中のtrim関数について
-
Oracleで「文字が無効です」の...
-
group byの並び順を変えるだけ...
-
テーブルのフィールドの一番長...
-
2つの列が同じ値の行を取得するSQL
-
timestamp型のgroup
-
SELECTした合計値をそのまま割...
-
データ
-
updateで複数行更新したい
-
Null値件数をカウントする式に...
-
BLOBやCLOBのパフォーマンスを...
-
VB データグリッドビューへの表示
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
<SQL>重複しているデータの場合...
-
複数のテーブルから値を合計出...
-
MySQLのdatetime型に0月0日を格納
-
最新の日付と2番目の日付のデー...
-
mysqlでクロス集計を取りたいが...
-
サブクエリを使わない方法
-
Mysqlで最新の日付を持つデータ...
-
SQLで、同じ値が何回連続す...
-
SQL 重複しないJoinの仕方を教...
-
型変換
-
MySQLで特定のグループの上位3...
-
日付検索で0001-01-01 00:00:00...
-
SQLです。下記の問合せを行うク...
-
直近1ヶ月に誕生日を迎える社員...
-
ここで「interval」は どんな働...
-
先期末日の日付を求めるSQL
-
mysqlのif文かcase文で複数条件...
-
MySQLで日付(date)型のdefaul...
-
日付のフォーマット
-
「8月の第3土日」をデータベ...
おすすめ情報