2

仲間のプログラマー、

次の列があるテーブルを取得しました:

[tablename - usertimes]
id - int(11)
user_id - int(11)
time - timestamp
deleted - tinyint(1)

次の行があると想像してください。

[id] [user_id]      [time]       [deleted]
------------------------------------------
 1       1     2013-02-25 16:40     0
 2       1     2013-02-25 14:40     0
 3       1     2013-02-25 11:20     1
 4       1     2013-02-26 11:20     1
 5       2     2013-02-23 16:40     0
 6       2     2013-02-25 16:40     0

今、私は時間でグループ化する必要がdate(あり)ます。ここで、削除された時間はfalseではありません。しかし!!!その日付の唯一の行がdeleted=trueである場合、それを返す必要があります。したがって、次の行を返す必要があります。user_idmin()

[id] [user_id]      [time]       [deleted]
------------------------------------------
 2       1     2013-02-25 14:40     0
 4       1     2013-02-26 11:20     1
 5       2     2013-02-23 16:40     0
 6       2     2013-02-25 16:40     0

これに対する最善のアプローチは何でしょうか?すべての行を取得して、コードでチェックする必要がありますか?これについてはクエリが可能である必要があると思いますが、頭を包むことはできません。

編集:

誰かがこのフィドルで遊んでくれませんか?: http ://sqlfiddle.com/#!2 / 4f91a

テーブルの内容と必要な出力がコメント化されています。

EDIT2:

これは、このフィドルによる出力です:http ://www.sqlfiddle.com/#!2/3808b/1

| ID | USER_ID | DELETED |             TIME |
---------------------------------------------
|  1 |       1 |       0 | 2013-02-25 14:40 |
|  4 |       1 |       1 | 2013-02-26 11:20 |
|  5 |       2 |       0 | 2013-02-23 16:40 |
|  6 |       2 |       0 | 2013-02-25 16:40 |

これは私が達成したいことに本当に近いです。私が達成したいのはこの結果であるため 、最初のIDに注意してください。

| ID | USER_ID | DELETED |             TIME |
---------------------------------------------
|  2 |       1 |       0 | 2013-02-25 14:40 |
|  4 |       1 |       1 | 2013-02-26 11:20 |
|  5 |       2 |       0 | 2013-02-23 16:40 |
|  6 |       2 |       0 | 2013-02-25 16:40 |
4

2 に答える 2

2

一体何をしているのかわかりませんが、このクエリで結果が得られます

select ut.*
from usertimes ut
join (
select user_id,deleted, min(time) as time
from usertimes
group by date(time), user_id, deleted
) a on a.user_id = ut.user_id and a.time = ut.time
group by ut.user_id, date(ut.time)
order by ut.user_id
于 2013-02-23T07:30:40.363 に答える
0

このSQLフィドルを試してください :

(
SELECT id,user_id,deleted,min(time) as TIME
FROM usertimes
WHERE deleted=0
GROUP BY date(time), user_id
)
UNION
(
SELECT id,user_id,deleted,time FROM(
SELECT *,COUNT(user_id) as cnt_user_id 
FROM usertimes GROUP BY user_id,date(time) 
)a
WHERE a.deleted=1 and a.cnt_user_id =1  
)ORDER BY user_id
于 2013-02-23T06:23:23.390 に答える