2012-05-10 11 views
1

私はチェックインとチェックアウト機能を備えたPHPとMySQLのシンプルなプロジェクトに取り組んでいます。1つのテーブルの行をマージすると重複した結果が表示される

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

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 | 
+--------+---------+---------------------+----------+ 

ここに私の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に3である必要があり、ID 1およびID 7は、同じチェックアウトの日付を持っています。誰もが素晴らしいアイデアを持っている場合は、私が達成したい何

この

+----+---------+---------------------+---------------------+ 
| 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 | 
+----+---------+---------------------+---------------------+ 

ようなものです..おかげで多くのことを共有してください。

+0

。これがあなたの問題の理解を損なうとは思っていませんが、一貫性のあるように質問を編集したいかもしれません。 – eggyal

+0

@eggyal、あなたはポイントを得て、あなたは私にアイデアを与え、log_idが原因です。私は自分のSQLを更新し、今すぐ動作します。 –

+0

解決策を回答として投稿する必要があります。一定の時間が経過すると、それを受け入れることができます。 – Ilion

答えて

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; 
+0

ありがとう、これは101%働いています。 –

1

たぶん、このような何か:あなたの質問の開始時に、あなたのテーブルに示されている `log_id`値が他の場所で示す出力を両立していない

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 
+0

あなたのアイデアも同様に動作します。ありがとう。 –

+0

問題ありません。喜んで助けてください:P – Arion

関連する問題