在我的数据库中,我得到了具有以下结构的下表:
[taskdate_user]
id : int
user_id : int
taskdate_time : datetime
例如,如果我得到2行,则包含以下数据:
id : 1
user_id : 1
taskdate_time : 2013-01-25 10:15
id : 2
user_id : 1
taskdate_time : 2013-01-25 11:15
我需要过滤掉用户和taskdate_time组合的最早时间。我现在收到以下问题:
// Get all the TaskdateUser objects for this week
$taskdateuser = TaskdateUser::where('taskdate_time', '>=', $this_monday)->where('taskdate_time', '<', $this_sunday)->order_by('taskdate_time', 'ASC')->get();
这将获取本周的所有TaskdateUser对象,但它确实返回所有这些对象。现在,我按taskdate_time排序,我正在进行提升。所以我为user_id - taskdate_time组合选择每个第一个对象。
这似乎是很多额外的代码来过滤掉第一个user_id - 日期组合。有没有人建议简化这个?非常感谢提前!
编辑2:
我需要每个用户每个日期的最早时间。
我已按以下方式编辑了我的查询:
$taskdateuser = TaskdateUser::where('taskdate_time', '>=', $monday)
->where('taskdate_time', '<', $sunday)
->raw_where('id IN
(
SELECT id
FROM taskdate_user
GROUP BY date_format(taskdate_time, "%Y-%m-%d"), user_id
)')
->order_by('taskdate_time', 'ASC')
->get();
如果我回显所有taskdate_times,输出如下:
2013-01-21 14:14:00
2013-01-21 17:47:02
2013-01-25 10:56:00
2013-01-26 17:56:41
我在2013-01-26和2013-01-25有多个taskdate_time,只会显示一次。而2013-01-21总是出现2次。这是为什么?
答案 0 :(得分:2)
Get the latest date from grouped MySQL data
您必须使用RAW查询,但如果我了解您的需求,那应该会对您有所帮助。
类似的东西:
$taskdateuser = DB::query(SELECT `id`,`user_id`,`taskdate_time` FROM `taskdate_user` WHERE `taskdate_time` IN (SELECT max(`taskdate_time`) FROM `taskdate_user`));