【问题标题】:Counting rows of sql data using where clause使用where子句计算sql数据的行数
【发布时间】:2019-10-06 04:39:45
【问题描述】:

quiz_record 表:

我需要计数所有具有marks 小于 Student_Id['4']marks 的行。

,如果其他人的标记与Student_Id['4']的标记相差相同,那么也计算所有time gap (Quiz_End - Quiz_Start)大于的人Student_Id['4']中的time gap (Quiz_End - Quiz_Start)

预期结果: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

【问题讨论】:

    标签: php mysql mysqli pdo count


    【解决方案1】:

    试试这个(在 cmets 中有解释):

    $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;
    

    【讨论】:

      【解决方案2】:

      首先,你能指定 $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'];
      

      请注意,此代码应该在您的数据层中。如果提供更多详细信息,我可以详细说明。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-12
        • 1970-01-01
        • 1970-01-01
        • 2013-03-08
        • 1970-01-01
        • 2021-11-02
        • 1970-01-01
        相关资源
        最近更新 更多