我有一个包含两个日期/时间字段的 (MySQL) 表:start
和 end
(每个类型都是 datetime
)。我需要一个查询,为特定用户和定义的日期提供从 start
开始的最低值和 end
的最高值。我终于成功地进行了以下查询:
SELECT job.id, job.user_id, job.start, last.end
FROM job
JOIN job AS last
ON job.user_id = last.user_id
AND DATE( job.start ) = DATE( last.start )
AND last.end = (SELECT max( last2.end)
FROM job AS last2
WHERE last2.user_id = last.user_id
AND DATE( last2.end ) = DATE( last.end ))
WHERE job.user_id = 1
AND DATE( job.start ) = '2012-05-28'
ORDER BY job.start ASC
LIMIT 0,1
尽管它有效,但它“感觉”不对。有没有更简单的方法来做到这一点? 非常感谢任何帮助和提示。谢谢!
示例数据:
user_id start end
1 2012-05-28 07:13:00 2011-04-26 07:45:00
1 2012-05-28 08:15:00 2011-04-26 08:50:00
1 2012-05-28 05:32:00 2011-04-26 05:51:00
1 2012-05-28 08:50:00 2011-04-26 09:50:00
1 2012-05-28 15:10:00 2011-04-26 15:40:00
1 2012-05-27 16:11:00 2011-04-26 16:46:00
2 2012-05-28 09:50:00 2011-04-26 10:35:00
最佳答案
Select user_id
, Min( start ) As MinStart
, Max( end ) As MaxEnd
From job
Where Date( start ) = '2012-05-28'
And user_id = 1
Group By user_id, Date( start )
根据您的评论,{1, 2012-5-28 5:32:00 2011-04-26 15:40:00}
是预期的输出(这就是示例输出的原因如此重要),这表明开始和结束日期值不一定与实际行的值相关。例如,示例数据中没有包含值组合的行。鉴于此,解决方案更简单。
我对 Date( start )
进行分组只是为了表明如果删除 Where 子句,则可以按开始日期确定最短和最长开始日期。鉴于您正在对两者进行过滤,您可以将查询简化为:
Select user_id
, Min( start ) As MinStart
, Max( end ) As MaxEnd
From job
Where Date( start ) = '2012-05-28'
And user_id = 1
Group By user_id
关于Mysql:在一行中获取一个字段的最高值和另一个字段的最低值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10777711/