2011-07-05 5 views
0

これは前のquestionsのいずれかで作成された質問です。テーブルは同じです:時間の競合が発生したユーザーを照会して、その時間の競合を返す必要があります。

Users 
------------------------------------ 
UserID | Name  | Assignable 
------------------------------------ 
    5 | John Doe |  1 

TimeSlots 
------------------------------------------------------- 
TimeSlotID | StartTime   | EndTime 
------------------------------------------------------- 
    3  | 2011-06-30 15:00:00 | 2011-06-30 16:00:00 

Appointments 
------------------------------------ 
TimeSlotID | UserID 
------------------------------------ 
    3  | 5 

回答が受け入れられたことで、特定の期間利用可能だったユーザーが見つかりました。開始日時と終了日時を入力して、その開始時刻と終了時刻の間にあるTimeSlotsのいずれかのデータ時刻と競合する何らかの方法が必要です。しかし、私はそう、それはユーザーが主催する必要があります

終了時間の開始日と終了日のために2011-07-07ためのI入力2011-07-05、その後、I開始時刻の入力07:0019:00場合。私は2人のユーザー(ユーザー1とユーザー2)がいて、Appointmentsがなく、Appointment2011-07-06 11:00にあるユーザーです。私がする結果を必要と何かのように:

ユーザー1:NULL
ユーザー2:(TimeSlots紛争のアレイ)

編集:私は開始に十分に明らかになった場合は知ってはいけません/終了日時。開始日と終了日の間の各日付(開始日と終了日)の競合を探します。

+0

です。こんにちは、私はあなたが3~4行のデータを入力することでより多くを記述するべきだと思います。彼が任命されていない場合、あなたはどのようにユーザーを認識できますか?ユーザーが指定されていない場合、どのように競合するのでしょうか? – Chandresh

答えて

1

前の回答に若干の変更 - あなたの間隔で開始し、それらのタイムスロットをキャッチし、(まだ技術的に、あなたの定義における紛争)が後に終了したり、間隔前に開始し、それの間に終了する:

SELECT 
    UserID 
    GROUP_CONCAT(CONCAT(StartTime, ' - ', EndTime)) slots 
FROM 
    Users 
    LEFT JOIN Appointments a USING (UserID) 
    LEFT JOIN TimeSlots ts ON (
     a.TimeSlotID = ts.TimeSlotID 
     AND (ts.EndTime > @start AND ts.StartTime > @end 
      OR ts.EndTime between @start and @end 
      OR ts.StartTime between @start and @end) 
    ) 
GROUP BY 
    UserID 
ORDER BY 
    UserID 

連結を使用したくない場合は、各タイムスロットを返すだけで、結果をPHPコードの配列に変換できます。この場合、SQLは

SELECT 
    UserID, 
    CONCAT(StartTime, ' - ', EndTime) slot 
FROM 
    Users 
    LEFT JOIN Appointments a USING (UserID) 
    LEFT JOIN TimeSlots ts ON (
     a.TimeSlotID = ts.TimeSlotID 
     AND (ts.EndTime > @start AND ts.StartTime > @end 
      OR ts.EndTime between @start and @end 
      OR ts.StartTime between @start and @end) 
    ) 
ORDER BY 
    UserID, StartTime 
1

MySQLは配列を返すことはできませんが、次のように近づくことができます。

SELECT 
    UserID, 
    GROUP_CONCAT(CONCAT(StartTime, ' - ', EndTime)) slots 
FROM 
    Users 
    LEFT JOIN Appointments a USING (UserID) 
    LEFT JOIN TimeSlots ts ON (
     a.TimeSlotID = ts.TimeSlotID 
     AND ts.EndTime > @start 
     AND ts.StartTime > @end 
    ) 
GROUP BY 
    UserID 

これはあなたのカンマ区切りのリスト(またはNULL)を与えるユーザーごとのタイムスロットから。

関連する問題