2012-05-27 59 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

相關問題