Подсчет строк данных SQL с использованием предложения - PullRequest
0 голосов
/ 19 мая 2019

quiz_record таблица:

enter image description here

Мне нужно подсчитайте все те строки, у которых marks меньше marks из Student_Id['4'].

Также , если другие отметки выключены , такие же , что и отметки Student_Id['4'], тогда также подсчитывают всех тех, у которых time gap (Quiz_End - Quiz_Start) равно больше чем time gap (Quiz_End - Quiz_Start) из Student_Id['4'].

Ожидаемый результат: 2

Для этого я пробовал:

$time_taken = strtotime($fetch_quiz_record['Quiz_End']) - strtotime($fetch_quiz_record['Quiz_Start']);

$count_less_played = $user->runQuery("SELECT COUNT(Id) AS Id FROM quiz_record WHERE Quiz_Id=:quiz_id AND Marks<=:marks AND (Quiz_End - Quiz_Start) >:time_diff");

$count_less_played->bindparam(":quiz_id",$fetch_quiz_record['Quiz_Id']);
$count_less_played->bindparam(":marks",$fetch_quiz_record['Marks']);
$count_less_played->bindparam(":time_diff",$time_taken);

$count_less_played->execute();

$count_less_played_cnt = $count_less_played->fetch(PDO::FETCH_ASSOC);

echo $count_less_played_no= $count_less_played_cnt['Id'];

Выход: 4

Ответы [ 2 ]

1 голос
/ 19 мая 2019

Попробуйте (пояснение в комментариях):

$time_taken = strtotime($fetch_quiz_record['Quiz_End']) - strtotime($fetch_quiz_record['Quiz_Start']);

/////--Counting Rows which have less than marks--/////

$count_less_marks = $user->runQuery("SELECT COUNT(Id) AS Id FROM quiz_record WHERE Quiz_Id=:quiz_id AND Marks<:marks");

$count_less_marks->bindparam(":quiz_id",$fetch_quiz_record['Quiz_Id']);
$count_less_marks->bindparam(":marks",$fetch_quiz_record['Marks']);

$count_less_marks->execute();

$count_less_marks_cnt = $count_less_marks->fetch(PDO::FETCH_ASSOC);

$count_less_marks_no= $count_less_marks_cnt['Id'];

/////--Counting Rows which have equal marks and time difference more--/////

$count_more_time = $user->runQuery("SELECT COUNT(Id) AS Id FROM quiz_record WHERE Quiz_Id=:quiz_id AND Marks=:marks AND TIMESTAMPDIFF(SECOND, Quiz_Start, Quiz_End) > :time_diff");

$count_more_time->bindparam(":quiz_id",$fetch_quiz_record['Quiz_Id']);
$count_more_time->bindparam(":marks",$fetch_quiz_record['Marks']);
$count_more_time->bindparam(":time_diff",$time_taken);

$count_more_time->execute();

$count_more_time_cnt = $count_more_time->fetch(PDO::FETCH_ASSOC);

$count_more_time_no= $count_more_time_cnt['Id'];

/////--Add both counts, to get required results--/////

$count_less_played = $count_less_marks_no + $count_more_time_no;

echo $count_less_played;
0 голосов
/ 19 мая 2019

обо всем по порядку, можете ли вы указать, что такое $ user и $ fetch_quiz_record? без этой информации я сначала выбрал бы ссылку, в вашем случае это quiz_record с Student_Id, равным 4.

$statement = $conn->prepare("
  SELECT 
    Quiz_Start,
    Quiz_End,
    Marks
  FROM quiz_record
  WHERE Student_Id = :student_id  
");

// in your case $student_id would be 4
$res = $statement->execute([':student_id' => $student_id]);
$selected_quiz = $res->fetch(PDO::FETCH_ASSOC);

$count_statement = $conn->prepare("
  SELECT 
    COUNT(*) as quiz_count
  FROM quiz_record
  WHERE 
    Marks < :mark_limit OR
    (Marks = :mark_limit AND TIMESTAMPDIFF(SECOND, Quiz_Start, Quiz_End > :seconds_diff))
");

// depending on the datatype of Quiz_Start and Quiz_End
$quiz_start = \DateTimeImmutable::createFromFormat("Y-m-d H:i:s", $selected_quiz['Quiz_Start']);
$quiz_end = \DateTimeImmutable::createFromFormat("Y-m-d H:i:s", $selected_quiz['Quiz_End']);
$diff_in_seconds =  abs($quiz_end->getTimestamp() - $quiz_start->getTimestamp());

$count_res = $count_statement->execute([
  ':mark_limit' => $selected_quiz['Marks'], 
  ':seconds_diff' => $diff_in_seconds
]);

$fetched = $count_res->fetch(PDO::FETCH_ASSOC);
// $count should be the count
$count = $fetched['quiz_count'];

обратите внимание, что этот код должен быть в вашем слое данных . я могу вдаваться в подробности, если предоставлена ​​более подробная информация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...