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 user
2 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 Date
Exam 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.
Müssen Sie nach Terminierungskonflikten suchen, d. H. Zwei Prüfungen, die gleichzeitig geplant sind? – toonice
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
Bin ich richtig in der Annahme, dass 'Sr.No' (was ich empfehle zu' srNum' zu ändern) der Primärschlüssel ist? – toonice