PHP&MySQLで従業員スケジュールを一覧表示する方法

このQ&Aのポイント
  • PHP&MySQLを使用して、支店の従業員のスケジュールを1週間分一覧表示するプログラムを作成しようとしています。
  • 現在は日付の出力までは成功していますが、予定の入っていない従業員も一覧表示に含めることができません。
  • 対策として、日付だけのテーブルを別途用意して連結させる方法や、複雑なSQL文を使用して抽出する方法が考えられますが、どちらが最適か悩んでいます。また、DBの構造を変更することも検討しています。
回答を見る
  • ベストアンサー

PHP&MySQL従業員一覧に対するスケジュール

2回目の質問です。 社員スケジュールを1週間分一覧出来るプログラムをPHP&MySQLで作ってます。 どうしても出来なかったです。 【shop (支店テーブル)】 shop_id ※オートインクリメント 支店ID name ※支店名 start_time ※Time型?お店の時間は固定 営業開始時間 last_time ※Time型?お店の時間は固定 営業終了時間 【worker (従業員テーブル)】 worker_id ※オートインクリメント 従業員ID shop_id ※支店ID worker_name ※従業員名 【schedule (予定テーブル)】 schedule_id ※オートインクリメント 予定ID worker_id ※従業員ID start_time ※DateTime型 勤務開始予定時間 last_time ※DateTime型 勤務終了予定時間 出力させたいのが支店の全従業員の名前と1週間分のデータなのですが、日付の出力までは出来ています。 予定の入って無い従業員に対しても、一覧表示に出したいのですがどうしても出来ません。 ※予定の入ってる従業員だけ出力するのは出来ます。 この場合、日付だけのテーブルを別途用意して連結させたら実現出来るのでしょうか? それとも複雑なSQL文で抽出する事が出来るのでしょうか? DBの構造変えたら作るよ!等の知恵を貸して戴けたら幸いです。 実現させたい出力イメージを画像で添付します。 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • shiren2
  • ベストアンサー率47% (139/295)
回答No.2

こんな感じでいけると思いますが、 確認してないので適当にいじってください。 インデントは全角スペースになっています。 SELECT * FROM worker  WHERE shop_id = ?  LEFT JOIN(   SELECT * FROM schedule   WHERE start_time > DATE_ADD(CURRENT_DATE, INTERVAL -7 DAY)  ) USING(worker_id)

その他の回答 (1)

回答No.1

予定の入ってる従業員だけ出力するのは出来ます。 ↑これのクエリ文ってどんな感じですか。 多分なんですが、テーブル結合に内部結合(inner join)ではなく、 外部結合(left joinなど)を用いると予定の入って無い従業員も 抽出されそうな気がします。

saorixs
質問者

お礼

有難う御座います無事解決出来ました!

saorixs
質問者

補足

日付だけのテーブルを用意してレフトジョインさせれば出来そうな感じがするのですが、どうでしょうか? ただその場合、日付が常に自動で最新の一週間を示す様にならなければいけなくて、難しいです。

関連するQ&A

  • PHP&MySQL日付をまたぐスケジュール表示

    初めて質問します。 社員スケジュールを1週間分一覧出来るプログラムをPHP&MySQLで作ってます。 どうしても出来なかったです。 【shop (支店テーブル)】 shop_id ※オートインクリメント 支店ID name ※支店名 start_time ※Time型?お店の時間は固定 営業開始時間 last_time ※Time型?お店の時間は固定 営業終了時間 【worker (従業員テーブル)】 worker_id ※オートインクリメント 従業員ID shop_id ※支店ID worker_name ※従業員名 【schedule (予定テーブル)】 schedule_id ※オートインクリメント 予定ID worker_id ※従業員ID start_time ※DateTime型 勤務開始予定時間 last_time ※DateTime型 勤務終了予定時間 条件 1.お店の営業時間で日付とスケジュール一覧が切り替わる。 0:00を過ぎた場合、どうしても上手に出来ません。 言葉だけでは伝わりにくいと思うのでExcelで出力イメージの画像も添付してます。 そのまま貼って使える様なソース等教えて戴けたら、ポイント等・・・ 知恵を貸して戴けるだけでも助かります。 急ぎ目なのでお願いします。

    • ベストアンサー
    • PHP
  • 【PHP,MySQL】連番の付け方について

    連番を下記の様に付けたいのですが、どなたかご教授ください。 参考になるURLでも結構です。 【環境】 ・MySQL バージョン: 5.1.41 ・PHP バージョン: 5.3.1 【現状】 ○親テーブル:nou_itiran ・entry_id [int(11)][auto_increment]主 ・その他カラム ○子テーブル:nou_ko ・ko_id [int(11)][auto_increment]主 ・entry_id [int(11)]←親テーブルの主キー値が入る ・その他カラム 2つのテーブルを作成しています。 親テーブルのカラム[entry_id]に対して、子テーブルの[ko_id]に 副番号をつけたいのですが、考え方がまとまりません。 現在は、 [親entry_id]/[子ko_id] 456/1 456/2 457/3 457/4 458/5 458/6 459/7 ・ ・ のように、[親entry_id]と[子ko_id]は個々に連番が発生します。 *********** 【達成したい内容】 456/1 456/2----★ 457/1 457/2----★ 458/1 458/2 459/3----★ [親entry_id]に対して、何番まで使われたか(★)を他のテーブルで 保持しておけばよいのかも??と思うのですが、 具体的な手法がわかりません。 ************* MySQLへのセレクト、インサートはPHPから行っております。 宜しくお願いいたします。

    • ベストアンサー
    • MySQL
  • PHPとMysqlを使用した集計表の作り方

    --------------媒体-------------- CREATE TABLE IF NOT EXISTS `media` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; INSERT INTO `media` (`id`, `name`) VALUES (1, 'yahoo'), (2, '楽天'), (3, '電話'), (4, 'メール'), (5, 'その他'); --------------店舗-------------- CREATE TABLE IF NOT EXISTS `shop` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; INSERT INTO `shop` (`id`, `name`) VALUES (1, '新宿'), (2, '池袋'), (3, '渋谷'), (4, '博多'), (5, '梅田'); --------------来客数-------------- CREATE TABLE IF NOT EXISTS `raikyakusuu` ( `id` int(11) NOT NULL AUTO_INCREMENT, `date` date DEFAULT NULL, `shop_id` int(2) DEFAULT NULL, `media_id` int(2) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8; INSERT INTO `raikyakusuu` (`id`, `date`, `shop_id`, `media_id`) VALUES (1, '2013-11-01', 1, 1), (2, '2013-11-01', 1, 1), (3, '2013-11-01', 1, 2), (4, '2013-11-01', 4, 4), (5, '2013-11-01', 1, 2), (6, '2013-11-02', 3, 1), (8, '2013-11-02', 3, 4), (9, '2013-11-02', 2, 2), (10, '2013-11-02', 2, 4), (11, '2013-11-03', 1, 4), (12, '2013-11-03', 3, 1), (13, '2013-11-05', 4, 3), (14, '2013-11-05', 1, 3), (15, '2013-11-06', 2, 2), (16, '2013-11-06', 3, 3), (17, '2013-11-06', 1, 5); select DATE_FORMAT(r.`date`,'%d日') as DayTime, count(*) as cnt, s.`name` as s_name, m.`name` as m_name from raikyakusuu r LEFT JOIN shop s ON s.`id` = r.`shop_id` LEFT JOIN media m ON m.`id` = r.`media_id` WHERE DATE_FORMAT(r.`date`, '%Y-%m') = '2013-11' GROUP BY DayTime, m.`name` 上記のセレクト文で取れた結果をPHPにて 新宿 媒体 |01日|02日|03日|04日|05日|06日|07日|08日|・・・ yahoo | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 楽天 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 電話 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | メール | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | その他 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 池袋 媒体 |01日|02日|03日|04日|05日|06日|07日|08日|・・・ yahoo | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 楽天 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 電話 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | メール | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | その他 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 渋谷 媒体 |01日|02日|03日|04日|05日|06日|07日|08日|・・・ yahoo | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 楽天 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 電話 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | メール | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | その他 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | といったようにtableにて表示を考えておりますが、 うまくだせずに困っております。 条件といたしましては、 結果で取れていない媒体、日付も表示させ、cntには0と表示させたいです。 お分かりの方がいらっしゃいましたらご教示お願いいたします。 端折らせていただいている部分も御座いますが、宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • PHP/MySQL INSERT文について。

    PHP/MySQL INSERT文について。 こんばんは。 PHP・MySQLでデータベースへデータの書き込みを試行錯誤しております。 そこで一つどうしても解決出来ない問題(謎)があるので質問させて頂きます。 簡易的な質問内容としては 全てのカラムに対する値の挿入は可能なのに カラムを指定して値を挿入しようとしたらエラーが出ます。 データベースの設定はテーブル名【TESTtable】 フィールド 種別 NULL 属性/その他 AAA int(6) No UNSIGNED ZEROFILL / auto_increment BBB int(4) Yes CCC int(4) Yes DDD int(4) Yes PHPでのSQL実行文をしてはの記述としては(値は全て可変で数値を代入します。) INSERT INTO TESTtable VALUES (last_insert_id(),50,600,50) とした場合は問題無くテーブルに書き込みされますが カラムを指定して INSERT INTO TESTtable (AAA,BBB,CCC,DDD) VALUES (last_insert_id(),50,600,50) とした場合、書き込みが行われません。 INSERT INTO TESTtable ('AAA','BBB','CCC','DDD') VALUES (last_insert_id(),50,600,50) INSERT INTO TESTtable (AAA,'BBB','CCC','DDD') VALUES (last_insert_id(),50,600,50) INSERT INTO TESTtable ('AAA','BBB','CCC','DDD') VALUES (last_insert_id(),'50','600','50') 等、色々試してみましたが不可能でした。 カラムAAAはauto_incrementにりますので毎回書き込みされますが BBB、CCC、DDDは書き込みが不要の場合もあるので カラム指定の書き込みは必須となるのですが・・・行き詰ってしまいました・・・。 ご教授頂ければ幸いです。 どうぞ、宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • 時間を自動計算してディフォルトに設定

    以下のようなテーブルを作りたいと思うのですが、 CREATE TABLE hogeTBL ( id bigint(20) NOT NULL AUTO_INCREMENT, product_code varchar(20) NOT NULL default, start_time datetime NOT NULL default '0000-00-00 00:00:00', end_time datetime NOT NULL default '0000-00-00 00:00:00', sub_time datetime NOT NULL default(ここにend_time-start_timeの値を設定したい), PRIMARY KEY (id) ) TYPE=MyISAM; 見たとおり、インサート時、sub_timeのところに自動で end_time - start_time の、差分値が挿入されるようにしたいのですが、構文が思いつきません。 そもそもこういったことはCreate Tableで可能なのでしょうか・・・? サーババージョンは4.1.22です。 宜しくお願いします。

    • ベストアンサー
    • MySQL
  • mySQLでのテーブル作成についての質問

    テーブル内の列で Field || Type || Null || Key || Default || Extra ID | int(6) | YES | UNI | NULL | auto_increment と言うテーブルを作成するにはどう記述したら良いのでしょうか? auto_incrementを指定した場合はフィールドにNULLを許可する事は出来ないのでしょうか?

  • PHP+MYSQLで画像のようなイベントスケジュールテーブルがあります

    PHP+MYSQLで画像のようなイベントスケジュールテーブルがあります。 start,endの型はDATETIMEです。当方宿屋なのですが、予約の時点で自動案内メールを 送っています。その中にお泊りのお客様の到着日に合わせたイベントリストを メールの中に入れて案内できるようなスクリプトを作りたいです。 が、到着日だけで検索するのではなく、プラスマイナス2日間くらいも含めて 紹介したいと思っています。願わくばもう一泊という気持ちもありますし。。。 当方で管理しているお客様の到着日は"2010-01-01"という形になっています。 要はpost_idだけ取れればいいです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • MySQL + PHP での自動採番

    関連する本を買い込みましたが、全然情報がないのでご助言下さい! 複数テーブルから文字列を抽出してIDを振るような入力フォームを作っています。 具体的には以下のような形を考えているのですが、どのように記述をしてよいのかさっぱりです・・・。 table1: +-----+-------------+------+------+-- | ID0 | ID1 | col1 | col2 | +-----+-------------+------+------+-- | 1 | KW0807-0001 | A | 3323 | | 2 | KX0807-0002 | B | 1122 | | 3 | KY0807-0003 | C | 4441 | | 4 | KW0807-0004 | A | 1256 | +-------------------+------+------+-- table2: +-----+------+------+-- | ID2 | col3 | col4 | +-----+------+------+-- | 1 | A | W | | 2 | B | X | | 3 | C | Y | | 4 | D | Z | +-----+------+------+-- ・ID0 は AUTO INCREMENT ・ID1 -> [K(規定値)] + [col1で入力する値よりcol4を抽出] + 入力した年 (08) + 入力した月 (07) + 0001 から始まる4桁の連番 ・col1, col2の入力と同時に、ID1 を自動で生成、入力 (table2は既存です) ひとまずこんな感じかな・・・と書いてみましたが、全然ダメです。 ID1の入力値は「KResource id #30807-」となってしまいました。 $y = date("y",time()); $m = date("m",time()); $renban = mysql_query(" select col4 from table1 INNER JOIN table2 //LEFT JOINでも可? ON col1.table1 = col3.table2 where '$col1' = col3 "); $ID1 = "K$renban$y$m-0000"; $sql = "insert into table1 values('$ID1', '$col1' '$col2'); ※4桁の連番もどうしてよいか分からないので、ひとまず「0000」としました。 何が足りないのか誤ってるのか・・・ご教授いただければ幸いです。

  • MySQLでinsertした行を取得する

    table t1 id name ------- 1 aaa 2 asv 3 aae といったauto incrementのidを持ったテーブルt1を考えたときに mysql_queryで新規行をinsertした場合にそのidを取得するような ことはできるのでしょうか? phpのmanualを参考にしたところ出来ないような感じのことが書かれて いたのですが,このようなことは頻繁に必要な気もするのですが・・・ 既に考えた案としては ・auto incrementを外して最大のidの1つ上を指定してinsertする ・一度lockしてからinsertして最大のidを取得する というものです もっと1つの関数かなにかでスマートに書けたらいいのですが

    • ベストアンサー
    • PHP
  • 1週間スケジュールを教えて下さい。

    申し訳ございませんが質問させてください。 風俗サイトのスケジュールを組み込んで欲しいとお客様に頼まれています。 当方PHP/Mysqlは初心者で、本やネットで勉強中ですが、お手上げ状態です。 本日日付|明日の日付|明後日の日付|・・・ と1週間の、スケジュール表示をしたいので、テーブル(id,In_time,In_time1,In_time2,out_time,out_time1,out_time2...)values(:id, :In_time, :In_time1, :In_time2, :out_time, :out_time1, :out_time2... )で作成して…とここで思考が止まってしまいます。 例えば日付はphpで出力? mysqlに格納して 出力? そもそも日付はSQL?PHP?どちらで取得するものなのか? どうやって朝5時に日付と時間を自動で更新するのかが、まったくわかりません。 お手数ではありますが、誰かご教授いただける人がいたら教えてください。 皆様お忙しいとは思いますが宜しくお願い致します。

専門家に質問してみよう