Как обнаружить студентов, которые сдают экзамены в последовательные дни? - PullRequest
0 голосов
/ 29 июня 2019

У меня есть таблица (Examdata), которая содержит 7 столбцов:

(Class_ID, Subject_ID, Student_ID, Subject_name, exam_days, даты экзамена, времена экзамена)

Я хочу определить «student_id», в котором есть экзамен и еще один экзамен на следующий день, например:

| student_id | subject_name | exam_days | exam_date |
|------------|--------------|-----------|-----------|
| 1          |  math        | Sunday    | 2/4/2019  |
| 1          | physical     | Monday    | 3/4/2019  |

Здесь student_id = "1" имеют два экзамена в последовательные дни, может быть, student_id больше, чем тот, для которого я хочу их обнаружить.

Примечание: если у студента есть экзамен в четверг и воскресенье, его не следует рассматривать, поскольку выходные дни между ними.

Это моя попытка:

<?php

$con = mysqli_connect("localhost", "root", "", "Exams");

$array1 = array();

$n = "SELECT DISTINCT exam_dates FROM Examdata ORDER BY exam_dates";

$queryarray1 = mysqli_query($con, $n) or die("Error in query: $queryarray1. ".mysqli_error());

while ($row = mysqli_fetch_assoc($queryarray1)) {
    $array1[] = $row;
}

// print_r($array1);

/* the output for this :

Array ( [0] => Array ( [exam_dates] => 1440-04-02 ) [1] => Array ( [exam_dates] => 1440-04-03 ) [2] => Array ( [exam_dates] => 1440-04-04 ) [3] => Array ( [exam_dates] => 1440-04-05 ) [4] => Array ( [exam_dates] => 1440-04-06 ) [5] => Array ( [exam_dates] => 1440-04-08 ) [6] => Array ( [exam_dates] => 1440-04-09 ) [7] => Array ( [exam_dates] => 1440-04-10 ) [8] => Array ( [exam_dates] => 1440-04-11 ) [9] => Array ( [exam_dates] => 1440-04-12 ) [10] => Array ( [exam_dates] => 1440-04-13 ) [11] => Array ( [exam_dates] => 1440-04-15 ) [12] => Array ( [exam_dates] => 1440-04-16 ) [13] => Array ( [exam_dates] => 1440-04-17 ) [14] => Array ( [exam_dates] => 1440-04-18 ) [15] => Array ( [exam_dates] => 1440-04-20 ) )
*/

$b = json_encode($array1);

$z = sizeof($array1);

for ($i = 0; $i < $z; $i++) {
    $search = "SELECT *  
            FROM Examdata e1
            ( 
               SELECT * 
               FROM examdata e2 where e1.exam_dates == $b[$i] && e2.exam_dates==$b($i++)  && e1.Student_ID==e2.Student_ID && e1.exam_days!='Thursday' && e2.exam_days!='sunday'
               ORDER BY `exam_dates`,`Student_ID `
            )";

    $querysearch = mysqli_query($con, $search) or die("Error in query: $querysearch. ".mysqli_error($con));

    while ($result = mysqli_fetch_array($querysearch)) {
        echo '<tr><td>' . $result['Class_ID'] .
         '</td><td>' . $result['Subject_ID'] .
         '</td><td>' . $result['Student_ID'] .
         '</td><td>' . $result['Subject_name'].
         '</td><td>' . $result['exam_days'] .
         '</td><td>' . $result['exam_dates'] .
         '</td><td>' . $result['exam_times'] .
         '</td></tr>';
    }
}

Сообщение об ошибке:

Ошибка в запросе:. У вас есть ошибка в вашем синтаксисе SQL; проверить руководство, которое соответствует вашей версии сервера MariaDB для права синтаксис для использования рядом с '(SELECT * from examdata e2, где e1.exam_dates == [ && e2.exam_dates = 'в строке 2

- но я не знаю, как передать массив в запросе.

Ответы [ 2 ]

1 голос
/ 29 июня 2019

Я дам вам решение, которое работает, и постараюсь придумать лучшее / более оптимизированное.

, поэтому нам нужно присоединиться к Таблице с самим собой по student_id, а затем мынеобходимо проверить, если экзамен1 наступает через 1 день после экзамена2, используя функцию DATEDIFF.

это запрос SQL:

SELECT examData1.student_id, examData1.subject_name as first_subject_name, examData2.subject_name as next_subject_name , examData1.exam_days as first_exam_day, examData2.exam_days as next_exam_day, examData1.exam_date, examData2.exam_date
FROM Examdata as examData1, Examdata as examData2
WHERE examData1.student_id = examData2.student_id AND DATEDIFF(examData2.exam_date,examData1.exam_date) = 1

проверьте эту ссылку , чтобы проверитьquery.

примечание: вы должны проверить синтаксис SQL, так как вы получаете ошибку синтаксиса.

0 голосов
/ 29 июня 2019

Получите даты экзамена по порядку, затем вы можете использовать что-то подобное в PHP, или ваше решение должно быть «чистым SQL»?

$currentStudent = 0;
$lastCheckedDate = 0;
$listOfStudentsWithConsecutiveDates = [];

while( $row = mysqli_fetch_array( $result )  ) {
    if( $currentStudent == $row['student_id'] ) {
       if( isset($listOfStudentsWithConsecutiveDates[ $row['student_id'] ]) ) continue;
       $datediff = strtotime( $row['exam_date'] ) - $lastCheckedDate;
       if( round($datediff / (60 * 60 * 24)) == 1 ) {
           $listOfStudentsWithConsecutiveDates[ $row['student_id'] ] = $row;
       );
    } else {
       $currentStudent = $row['student_id'];
       $lastCheckedDate = strtotime( $row['exam_date'] );
    }
}

Вы получите массив с

$listOfStudentsWithConsecutiveDates[ student_id ] = first exam which is consecutive to another one for this student
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...