2017-04-08 15 views
0

私は次の図のようなテーブル構造を持っています。基本的には、それはシフト1、シフト2などの所与のシフトで所与の試験センター/会場で所与の日付にE1、E2等の試験を与えるユーザID lke u1、u2を有する。1日に最大4シフト交代で。同じテーブルの結果を比較する結果を返すmysqlクエリを書くには?

この表があると、同じユーザーが同じ日付とセンターで連続して試験を行っている行を見つける必要があります。例えば、U1が同じ中心であるが連続的なシフト、すなわち1と2で2つの検査を与える画像では、赤い行がハイライトされる。ユーザが4つの連続したシフトで1日に最大4つの検査で与えることができる。

私が書きたいと思っているもう1つの質問は、同じユーザーが同じ日付に2つ以上の試験を異なるセンターで行っている場合です。青で強調表示された行。

enter image description here

+0

スケジュール競合、つまり2つの試験が同じ時間にスケジュールされているかどうかを確認する必要がありますか? – toonice

+0

はい、基本的には、ユーザーが複数の試験を1日に行っているかどうかを確認する必要があります。同じ試験所に同じセンターを与えて、センター間を移動する必要はありません。また、同じ日に複数の試験を同じセンターで行っている場合は、可能であればシフトを中断する必要があります。つまり、シフト1とシフト2で試験を受ける場合は、シフト3に再割り当てします私はこの報告書が必要です – ashishjmeshram

+0

'Sr.No'(' srNum'への変更をお勧めします)がプライマリキーであると仮定して正しいですか? – toonice

答えて

1

私はあなたがuserthe same datesame center2 or more examsを持っていたレコードを求めているあなたの質問を解釈してきた道...

SELECT tblExams.srNum AS srNum, 
     tblExams.user_id AS user_id, 
     tblExams.exam_id AS exam_id, 
     tblExams.exam_date AS exam_date, 
     tblExams.exam_center_id AS exam_center_id, 
     tblExams.exam_shift as exam_shift 
FROM tblExams 
JOIN 
{ 
    SELECT user_id AS user_id, 
      exam_date AS exam_date, 
      exam_center_id AS exam_center_id, 
      COUNT(exam_center_id) AS exam_center_id_count 
    FROM tblExams 
    GROUP BY user_id, 
      exam_date, 
      exam_center_id 
} exam_center_counter ON tblExams.user_id = exam_center_counter.user_id 
        AND tblExams.exam_date = exam_center_counter.exam_date 
        AND tblExams.exam_center_id = exam_center_counter.exam_center_id 
WHERE exam_center_counter.exam_center_id_count >= 2; 

を試してみてください。これは、Userが最も支配的な因子であり、その中でExam Dateであり、その内で0​​とcountExamsであることを示唆しています。したがって、私の内側SELECTステートメントからのGROUP BYCOUNT()行。

他の選択した3つのフィールドがある一部GROUP BYがそれらを使用するため、SELECTの一部となるためにそれらを必要とするため、部分的に、彼らは私があなたのテーブルのために仮定したINNER JOINtblExamsで(名前を形成するのに必要とされているので、データ)。 (注:単語JOINの前に結合タイプがない場合は、INNER JOINが実行されます)。 INNER JOIN

は、ここで対応する行(複数可)にそのUserためそのDateにそのExam Centerで行われる試験の数に粘着効果を有します。

次に、tblExamsの各行のすべてのフィールドを選択するだけです。その数は少なくとも2です。私はあるExam Centersのリストを取得するには最も内側のSELECTステートメントを使用して、このクエリで

私はあなたの2番目の問合せについては、以下のコードを作成するとき、このロジックのバリエーションを使用した

...

SELECT tblExams.srNum AS srNum, 
     tblExams.user_id AS user_id, 
     tblExams.exam_id AS exam_id, 
     tblExams.exam_date AS exam_date, 
     tblExams.exam_center_id AS exam_center_id, 
     tblExams.exam_shift as exam_shift 
FROM tblExams 
JOIN 
{ 
    SELECT user_id AS user_id, 
      exam_date AS exam_date, 
      COUNT(exam_center_id) AS exam_center_count 
    FROM 
    { 
     SELECT user_id AS user_id, 
       exam_date AS exam_date, 
       exam_center_id AS exam_center_id 
     FROM tblExams 
     GROUP BY user_id, 
       exam_date, 
       exam_center_id 
    } exam_center_id_grouper 
    GROUP BY user_id, 
      exam_date 
} exam_center_counter ON tblExams.user_id = exam_center_counter.user_id 
        AND tblExams.exam_date = exam_center_counter.exam_date 
WHERE exam_center_counter.exam_center_count >= 2; 

Userには、それぞれDatesが付いています。

このデータ

は、各 DATEExamのための各 User出席は、彼らがそうするどのように多くの Centersのリストを形成するために、中間最も SELECT文で使用されています。

このカウントは、外側のSELECTによって、指定された基準を満たすtblExamsの行のみを返すために使用されます。

ご不明な点がございましたら、お気軽にコメントを投稿してください。

+1

最初のクエリを含むAnswerを投稿しました。 2番目のクエリはまもなく続きます... – toonice

+0

ありがとう、最初のクエリは期待通りに動作します。 – ashishjmeshram

+1

私は2番目のクエリを追加して、今説明に取り組んでいます。 – toonice

関連する問題