2012-05-27 58 views
3

我有一个带有两个日期/时间字段的(MySQL)表:startend(每个类型datetime)。我需要一个查询,该查询将start的最低值和end的最高值分配给某个用户和一个定义的日期。我终于suceeded用下面的查询:即使Mysql:在一行中获得另一个字段的最高值和最低值

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 
+0

'DATE(job.start)'??? “job.start”列是什么类型? – zerkms

+0

datetime - 我更新了我的帖子 – Andreas

+0

一些示例数据和预期的输出将帮助我们帮助您。 – Thomas

回答

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 verison

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的作业。

+0

感谢提示,但它似乎并不奏效,因为开始的分钟在一行中,而结束的最大值在另一行中。 – Andreas

+0

这很奇怪,这正是我认为它应该起作用的原因。只要user_id是相同的,group by就可以轻松处理很多不同的行。然后,我们可以使用聚合函数min和max来选择我们想要的。它究竟是如何工作的? –

+0

它返回一个空的结果 – Andreas

相关问题