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(时间分组)user_id其中min(时间)我有删除的最短时间不是假的。但!!!如果该日期的唯一行已删除=true,则必须返回该行。所以它必须返回以下行:

[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

它具有表格内容和所需的输出注释。

编辑2:

这是根据这个小提琴的输出: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 回答