プロが教えるわが家の防犯対策術!

部屋の入り口にあるICカードチェッカーのログを利用してレポート作成を行う予定です。
DBはMysql5.1を利用しています。

mysql> select * from t1 ;
+------+---------------------+
| id | jikan | hito | inout |
+------+---------------------+
| 1 | 2011-07-20 12:50:01 |hiro|in|
| 2 | 2011-07-20 13:23:37 |misa|in|
| 3 | 2011-07-20 14:08:41 |hiro|out|
| 4 | 2011-07-20 15:27:02 |sasato|in|
| 5 | 2011-07-20 16:31:38 |misa|out|
| 6 | 2011-07-20 17:42:19 |hiro|in|
| 7 | 2011-07-20 18:19:09 |hiro|out|
| 8 | 2011-07-20 19:07:12 |misa|in|
+------+---------------------+
(jikanはdatetime形式)

レポート形式は下記を予定
|入室日時|退室日時|名前|

☆考え方
1.whereで「in」を指定して別テーブルB1を作成
2.whereで「out」を指定して別テーブルC1を作成

とここまで考えたのですがココから先がおもいつきません。

テーブルB1とC1のjikanを比較?
B1テーブルのhiroが12:50にinした時間を基準にC1テーブルの
hiroのout時間のtimediffが小さいものを探す・・・?

どなたか妙案がありましたらご教授いただきたく。

よろしくお願いします。

A 回答 (3件)

データに重複が無いと仮定します。


考え方
(1)人単位に'in'のデータを抽出する。→A
(2)人単位に'out'のデータを抽出する。→B
(3)AからBを見て同じ人で、時刻が大きいものの中から
 最も小さい時刻が退出時刻になる。

select A.jikan as nyuushitsu,min(B.jikan) as taishutsu,
A.hito from
(select jikan,hito from t1 where inout='in') A
left join
(select jikan,hito from t1 where inout='out') B
on A.hito=B.hito and A.jikan<B.jikan
group by A.jikan,A.hito

6行目の結合条件に着目して下さい。
不等号の結合条件というのを思いつかないと
解決しない問題です。サブクエリを使うことで、
B1とかC1は不要になります。
    • good
    • 0
この回答へのお礼

サンプルSQLありがとうございます。

早速試してみます。

以上よろしくお願いします。

お礼日時:2011/07/21 12:34

ちなみに#1さんの回答はサブクエリを使わず、こう書いた方が


インデックスが効きやすいかもしれません

select A.jikan as nyuushitsu,min(B.jikan) as taishutsu,A.hito
from t1 AS A
left join t1 AS B
on A.hito=B.hito
and B.inout='out'
and A.jikan<B.jikan
where A.inout='in'
group by A.jikan,A.hito
    • good
    • 0
この回答へのお礼

サンプルSQLありがとうございます。

こちらも試させていただきます。

以上よろしくお願いします。

お礼日時:2011/07/21 12:43

おなじhitoが一日なんども入退室するのであれば


入室と退室に相関関係があるので最初から1組で管理すればすっきりしますよ

処理としては入室時にhitoと入室時間を書きこみ、退出時間はNULL
退出時に退出時間がNULLのhitoのレコードに退出時間を書きこむ
    • good
    • 0
この回答へのお礼

アイデアありがとうございます。

機械から出てくる生ログが時系列に
記載されているだけなので・・・・

設計するときのポイントとして
覚えておきます。

お礼日時:2011/07/21 12:32

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

関連するカテゴリからQ&Aを探す