2017-04-08 1 views
0

Ich habe eine Tabellenstruktur wie in der folgenden Abbildung gezeigt. Im Grunde hat es Benutzer, die Prüfungen wie E1, E2 usw. an einem bestimmten Prüfungszentrum/Veranstaltungsort in gegebener Schicht wie Schicht 1, Schicht 2 usw. geben. Es wird maximal 4 Schichten an einem Tag geben mit Verschiebungen Nr. von 1 bis 4.Wie schreibe ich eine MySQL-Abfrage, um ein Ergebnis zu liefern, das Zeilen derselben Tabelle vergleicht?

In Anbetracht dieser Tabelle muss ich herausfinden, in welchen Reihen derselbe Benutzer die Prüfung am selben Datum und in der Mitte durchführt, aber in kontinuierlichen Schichten. B. rote Reihen, die im Bild hervorgehoben sind, wobei U1 zwei Untersuchungen in der gleichen Mitte, aber in kontinuierlichen Verschiebungen, d. h. 1 und 2, durchführt. Es kann vorkommen, dass der Benutzer maximal 4 Prüfungen an einem Tag in 4 aufeinanderfolgenden Schichten gibt.

Eine weitere Abfrage, die ich zu schreiben versuche, ist, wo, wenn derselbe Benutzer zwei oder mehr Prüfungen am gleichen Datum gibt, aber in verschiedenen Zentren. Zeilen blau markiert

enter image description here

+0

Müssen Sie nach Terminierungskonflikten suchen, d. H. Zwei Prüfungen, die gleichzeitig geplant sind? – toonice

+0

Ja, im Grunde müssen wir überprüfen, ob ein Benutzer mehrere Prüfungen an einem einzigen Tag durchführt, wir wollen ihm das gleiche Zentrum geben, damit er nicht zwischen den Zentren laufen muss. Wenn der Benutzer mehrere Prüfungen am gleichen Tag und in derselben Zentrale abgibt, müssen wir ihm, wenn möglich, eine Pause zwischen den Schichten einräumen, dh wenn er eine Prüfung in Schicht 1 und Schicht 2 durchführt, wollen wir Schicht 3 neu zuweisen oder shift 4. SO brauchen wir diesen Bericht – ashishjmeshram

+0

Bin ich richtig in der Annahme, dass 'Sr.No' (was ich empfehle zu' srNum' zu ändern) der Primärschlüssel ist? – toonice

Antwort

1

Bitte versuchen Sie es ...

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; 

So wie ich Ihre Frage interpretiert haben Sie Datensätze zu fragen, wo die user2 or more exams im same center auf the same date hat. Dies schlug mir vor, dass der User der dominanteste Faktor war, und innerhalb dieser Exam Date, und innerhalb dieser Centers und der count von Exams. So die GROUP BY und COUNT() Zeilen von meiner inneren SELECT Aussage.

Die anderen drei ausgewählten Felder gibt es zum Teil, weil die GROUP BY sie verwendet und somit verlangt, dass sie Teil der SELECT und zum Teil, weil sie den INNER JOIN mit tblExams (den Namen, die ich für die Tabelle übernommen habe zu bilden nötig sind, um von Daten). (Hinweis: Wenn dem Wort JOIN kein Join-Typ vorangestellt ist, wird INNER JOIN ausgeführt).

Die INNER JOIN hat die Wirkung, hier auf der Anzahl der Prüfungen Anheften in den für diese User auf die entsprechende Zeile an diesen DateExam Center Aufnahme (n).

Dann müssen wir nur alle Felder aus jeder Zeile von tblExams auswählen, wobei diese Zahl mindestens 2 ist.

Eine Variation dieser Logik verwendet wurde, als ich den folgenden Code für Ihre zweite Abfrage erstellt ...

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; 

In dieser Abfrage verwende ich die am weitesten innen SELECT-Anweisung eine Liste von Exam Centers zu erhalten, sind besucht von jedem User auf verschiedenen Dates.

Diese Daten werden dann von der mittleren meisten SELECT Anweisung verwendet, um eine Liste, wie viele Centers zu bilden, die jeweils User Attends für eine Exam auf jeder DATE sie dies tun.

Diese Anzahl wird von den äußersten SELECT verwendet, um nur die Zeilen aus tblExams zurückzugeben, die die angegebenen Kriterien erfüllen.

Wenn Sie irgendwelche Fragen oder Kommentare haben, dann zögern Sie nicht, einen Kommentar entsprechend zu posten.

+1

Ich habe eine Antwort geschrieben, die die erste Abfrage enthält. Die zweite Abfrage soll in Kürze folgen ... – toonice

+0

danke, erste Abfrage funktioniert wie erwartet. – ashishjmeshram

+1

Ich habe die zweite Abfrage hinzugefügt und arbeite jetzt an der Erklärung. – toonice

Verwandte Themen