1

チェックインおよびチェックアウト機能を備えた単純な PHP および MySQL プロジェクトに取り組んでいます。

単一のテーブルで行をマージする際に少し問題があります。以下は、行をマージせずに表示できる生データです。

mysql> SELECT * FROM clock;
+--------+---------+---------------------+----------+
| log_id | user_id | xtimestamp           | text     |
+--------+---------+---------------------+----------+
|      1 | 1000     | 2012-05-10 07:47:06 | CHECKIN  |
|      2 | 1003     | 2012-05-10 07:47:23 | CHECKIN  |
|      3 | 1002     | 2012-05-10 07:47:36 | CHECKIN  |
|      4 | 1002     | 2012-05-10 07:47:49 | CHECKOUT |
|      5 | 1003     | 2012-05-10 07:48:11 | CHECKOUT |
|      6 | 1000     | 2012-05-10 07:48:23 | CHECKOUT |
|      7 | 1000     | 2012-05-10 07:48:52 | CHECKIN  |
+--------+---------+---------------------+----------+

これは、1 つのテーブルの行をマージしてチェックインとチェックアウトのビューを持つ SQL クエリです。

SELECT a.log_id as 'ID'
 , a.user_id as 'User_ID'
 , a.xtimestamp as 'CHECKIN'
 , b.xtimestamp as 'CHECKOUT' 
FROM clock a, clock b 
WHERE a.info = 'CHECKIN' 
AND b.info = 'CHECKOUT' 
AND a.user_id = b.user_id 
GROUP BY a.log_id;

そして、これがクエリの結果です。

+----+---------+---------------------+---------------------+
| ID | User_ID | CHECKIN             | CHECKOUT            |
+----+---------+---------------------+---------------------+
|  1 | 1000    | 2012-05-10 07:47:06 | 2012-05-10 07:48:23 |
|  2 | 1003    | 2012-05-10 07:47:23 | 2012-05-10 07:48:11 |
|  3 | 1002    | 2012-05-10 07:47:36 | 2012-05-10 07:47:49 |
|  7 | 1000    | 2012-05-10 07:48:52 | 2012-05-10 07:48:23 |
+----+---------+---------------------+---------------------+

上記の結果からわかるように、4 つのレコードが返されますが、user_id 1000 の ID 7 にはまだ CHECKOUT レコードがなく、id 1 と id 7 の CHECKOUT 日付が同じであるため、3 になるはずです。

私が達成したいのは、このようなものです

+----+---------+---------------------+---------------------+
| ID | User_ID | CHECKIN             | CHECKOUT            |
+----+---------+---------------------+---------------------+
|  1 | 1000    | 2012-05-10 07:47:06 | 2012-05-10 07:48:23 |
|  2 | 1003    | 2012-05-10 07:47:23 | 2012-05-10 07:48:11 |
|  3 | 1002    | 2012-05-10 07:47:36 | 2012-05-10 07:47:49 |
|  7 | 1000    | 2012-05-10 07:48:52 | null                |
+----+---------+---------------------+---------------------+

またはこのように

+----+---------+---------------------+---------------------+
| ID | User_ID | CHECKIN             | CHECKOUT            |
+----+---------+---------------------+---------------------+
|  1 | 1000    | 2012-05-10 07:47:06 | 2012-05-10 07:48:23 |
|  2 | 1003    | 2012-05-10 07:47:23 | 2012-05-10 07:48:11 |
|  3 | 1002    | 2012-05-10 07:47:36 | 2012-05-10 07:47:49 |
+----+---------+---------------------+---------------------+

誰かが素晴らしいアイデアを持っている場合は、共有してください..どうもありがとう。

4

2 に答える 2

1
SELECT   check_in.log_id           AS `CHECKIN ID`
  ,      check_in.user_id          AS `User_ID`
  ,      check_in.xtimestamp       AS `CHECKIN`
  ,      MIN(check_out.xtimestamp) AS `CHECKOUT` 
FROM     clock                     AS `check_in`
  JOIN   clock                     AS `check_out`
      ON (
           check_out.info = 'CHECKOUT'
       AND  check_in.info = 'CHECKIN'
       AND  check_in.user_id     = check_out.user_id
       AND  check_in.xtimestamp <= check_out.xtimestamp
      )
GROUP BY check_in.log_id, check_in.user_id, check_in.xtimestamp;
于 2012-05-10T10:01:12.537 に答える
1

多分このようなもの:

SELECT
    MIN(CASE WHEN info='CHECKIN'  THEN xtimestamp ELSE NULL END) AS CHECKIN,
    MAX(CASE WHEN info='CHECKOUT'  THEN xtimestamp ELSE NULL END) AS CHECKOUT,
    MAX(log_id) AS ID,
    User_ID
FROM
    clock
GROUP BY
    User_ID
于 2012-05-10T08:55:48.200 に答える