3

我有一个(MySQL)表,其中包含两个日期/时间字段:startend(每个类型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
4

2 回答 2

4
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

SQL Fiddle版本

于 2012-05-27T23:09:05.830 回答
1
SELECT job.user_id,min(job.start) AS orderby,max(job.end)
FROM job
WHERE job.user_id=1
GROUP BY job.user_id
HAVING DATE(job.start)='2012-05-28'
ORDER BY orderby
LIMIT 1

未经测试,希望它对你有用,并且更有意义。

通过使用聚合函数,我们可以很容易地找到最小值和最大值,但是我必须取出(或者我可以包含,但会使查询更加复杂)的是 job.id。如果需要包含它,则必须使用子查询来选择具有该 user_id 和 job.start 的作业与最小值匹配。

于 2012-05-27T22:32:01.977 回答