3

2 つの日付/時刻フィールドを持つ (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 に答える