【问题标题】:Counting a specific table result after executing a SELECT statement执行 SELECT 语句后统计特定表结果
【发布时间】:2019-12-31 20:53:48
【问题描述】:

我是某公司的实习生。他们让我为计算机设备做一个监控系统。我做了一个过滤选项来过滤表格的结果。过滤器选项包含称为“条件”和“状态”的单选按钮。条件是一列,仅具有可用、已分配、用于维修、缺少零件、缺少 eq、有缺陷、翻新和未知条件的值。状态也是一个只有新、旧和未知状态值的列。这些列值也是过滤器选项中的单选按钮。问题是我想在单选按钮标签旁边显示值的数量,但我想不出一种方法来计算这些结果,因为我已经使用 SELECT 语句来显示表结果。有没有办法计算 SELECT 语句执行后生成的值?每当用户单击单选按钮或过滤器选项发生更改时,都会发生 select 语句。我只是想计算可用、已分配、用于维修等。顺便说一句,allstate、allcondition 和 working 只是单选按钮,而不是列值。存储在 $state 和 $condition 变量中的是存储在用于过滤表结果的 PHP 会话中的单选按钮值。使用单选按钮的过滤已经开始工作。以下是我的代码:

<?php
 $state=$_SESSION['state'];
 $condition=$_SESSION['condition'];
 ?>

 <span style="margin-left:35px;">STATE</span><br><br>
 <form>
 <input type="radio" name="state" id="state" value="allstate" 
  onchange="javascript:handleRadio(this)" <?php echo $state==='allstate' ? 
  'checked' : '' ?>> All State <br>
  <input type="radio" name="state" id="new" value="new" 
 onchange="javascript:handleRadio(this)" <?php echo $state==='new' ? 
 'checked' : '' ?>> New EQ <br>
<input type="radio" name="state" id="old" value="old" 
onchange="javascript:handleRadio(this)" <?php echo $state==='old' ? 
'checked' : '' ?>> Old EQ <br>
<input type="radio" name="state" id="unknown" value="Unknown state" 
onchange="javascript:handleRadio(this)" <?php echo $state==='Unknown state' 
? 'checked' : '' ?>> Unknown State <br>
</form>

                                         <!--    -->
<form action="" method="POST" class="filters2">
<span style="margin-left:150px;">CONDITION</span><br><br>
<input type="radio" name="condition" value="allcondition" 
onchange="javascript:handleRadiocond(this)" <?php echo 
$condition==='allcondition' ? 'checked' : '' ?>> All Condition <br>
<input type="radio" name="condition" value="working" 
onchange="javascript:handleRadiocond(this)" <?php echo 
$condition==='working' ? 'checked' : '' ?>> Working EQ (1 & 2): <br>
<input type="radio" name="condition" value="Available/Unassigned" 
onchange="javascript:handleRadiocond(this)" <?php echo 
$condition==='Available/Unassigned' ? 'checked' : '' ?>> 
(1)Available/Unassigned EQ:<br>
 <input type="radio" name="condition" value="assigned" 
 onchange="javascript:handleRadiocond(this)" <?php echo 
 $condition==='assigned' ? 'checked' : '' ?>>(2)Assigned EQ:<br>
<input type="radio" name="condition" value="repair" 
onchange="javascript:handleRadiocond(this)" <?php echo $condition==='repair' 
  ? 'checked' : '' ?>> For Repair EQ:<br>
<div class="filters3">
<input type="radio" name="condition" value="missingpart" 
onchange="javascript:handleRadiocond(this)" <?php echo 
$condition==='missingpart' ? 'checked' : '' ?>> W/ Missing Parts EQ: <br>
<input type="radio" name="condition" value="missingeq" 
onchange="javascript:handleRadiocond(this)" <?php echo 
$condition==='missingeq' ? 'checked' : '' ?>> Missing EQ: <br>
<input type="radio" name="condition" value="defective" 
onchange="javascript:handleRadiocond(this)" <?php echo 
 $condition==='defective' ? 'checked' : '' ?>> Defective EQ <br>
<input type="radio" name="condition" value="refurbished" 
onchange="javascript:handleRadiocond(this)" <?php echo 
$condition==='refurbished' ? 'checked' : '' ?>> Refurbished: <br>
<input type="radio" name="condition" value="Unknown condition" 
onchange="javascript:handleRadiocond(this)" <?php echo $condition==='Unknown 
 condition' ? 'checked' : '' ?>> Unknown Condition: <br>
 </div>
 </form>

<?php
if($state=='allstate' && $condition=='allcondition'){
 $sql = (
"SELECT *
 from eq_inv
 left JOIN empl_tbl
    on eq_inv.empl_no=empl_tbl.empl_no
 WHERE eq_state='new'
 OR eq_state='old'
 OR eq_state='Unknown state'
 AND (eq_condition='Available/Unassigned'
   OR eq_condition='assigned'
   OR eq_condition='repair'
   OR eq_condition='missingpart'
   OR eq_condition='missingeq'
   OR eq_condition='refurbished'
   OR eq_condition='Unknown condition')
 ORDER BY empl_firstname
      , empl_lastname
      , middlename  ASC"
  );
}

elseif($state=='allstate' AND ($condition=='Available/Unassigned' OR 
$condition=='assigned' OR   $condition=='repair' OR 
$condition=='missingpart' OR $condition=='mmissingeq' OR 
$condition=='defective' OR $condition=='refurbished' OR $condition=='Unknown 
condition')){
$sql = (
"SELECT *
from eq_inv
left JOIN empl_tbl
  on eq_inv.empl_no=empl_tbl.empl_no
WHERE eq_condition='$condition'
AND (eq_state='new'
  OR eq_state='old'
  OR eq_state='Unknown state')
ORDER BY empl_firstname
  , empl_lastname
  , middlename  ASC"
  );
 }
 elseif($condition=='allcondition' AND ($state=='new' OR $state=='old' OR 
 $state=='Unknown state')){
  $sql = (
"SELECT *
from eq_inv
left JOIN empl_tbl
  on eq_inv.empl_no=empl_tbl.empl_no
  WHERE eq_state='$state'
  AND (eq_condition='Available/Unassigned'
    OR eq_condition='assigned'
    OR eq_condition='repair'
    OR eq_condition='missingpart'
    OR eq_condition='missingeq'
    OR eq_condition='refurbished'
    OR eq_condition='Unknown condition')
  ORDER BY empl_firstname
    , empl_lastname
    , middlename  ASC"
  );
  }
  elseif($condition=='working' AND ($state=='new' OR $state=='old' OR 
  $state=='Unknown state')){
        $sql = (
          "SELECT *
          from eq_inv
          left JOIN empl_tbl
            on eq_inv.empl_no=empl_tbl.empl_no
          WHERE eq_state='$state'
          AND (eq_condition='Available/Unassigned'
            OR eq_condition='assigned')
          ORDER BY empl_firstname
            , empl_lastname
            , middlename  ASC"
          );
        }
       elseif($condition=='working' AND ($state=='allstate')){
                $sql = (
                  "SELECT *
                  from eq_inv
                  left JOIN empl_tbl
                    on eq_inv.empl_no=empl_tbl.empl_no
                  WHERE eq_state='new'
                  OR eq_state='old'
                  OR eq_state='Unknown state'
                  AND (eq_condition='Available/Unassigned'
                    OR eq_condition='assigned')
                  ORDER BY empl_firstname
                    , empl_lastname
                    , middlename  ASC"
                  );
                }
           else{
        $sql = (
      "SELECT *
     from eq_inv
      left JOIN empl_tbl
       on eq_inv.empl_no=empl_tbl.empl_no
       WHERE eq_state='$state'
       AND eq_condition='$condition'
      ORDER BY empl_firstname
    , empl_lastname
    , middlename  ASC"
    );
  }
    $result = mysqli_query($conn, $sql);
    while($row = mysqli_fetch_assoc($result)) {
   ?>
      <td>
      <a href="temporarypopup.php"><button>View</button></a>
      </td>
      <td style="font-size:16px;"><STRONG><?php echo $row['eqdesc']; ?> 
      </STRONG></td>
      <td><?php echo $row['eq_inv_id']; ?></td>
      <td style="color:red; font-size:15px;"><strong><a href="timeline.php? emp_no=<?php echo $row['empl_no'];?>" style="color:inherit;"><?php echo 
      $row['empl_firstname']; ?></a></strong></td>
      <td style="color:red; font-size:15px;"><strong><a href="timeline.php? emp_no=<?php echo $row['empl_no'];?>" style="color:inherit;"><?php echo 
       $row['middlename']; ?></a></strong></td>
      <td style="color:red; font-size:15px;"><strong><a href="timeline.php?emp_no=<?php echo $row['empl_no'];?>" style="color:inherit;"><?php echo 
       $row['empl_lastname']; ?></a></strong></td>
      <td><?php echo $row['brand']; ?></td>
        <td><?php echo $row['serial_no']; ?></td>
        <td><?php echo $row['eq_state']; ?></td>
        <td><?php echo $row['eq_condition']; ?></td>
      <td><?php echo $row['curr_equip_loc']; ?></td>
    </tbody>
     <?php
      }

     ?>

【问题讨论】:

  • 你应该看看mysql中的in()操作符。它将使eq_condition='Available/Unassigned' OR eq_condition='assigned' OR eq_condition='repair' OR eq_condition='missingpart' OR eq_condition='missingeq' OR eq_condition='refurbished' OR eq_condition='Unknown condition' 更易于阅读,并在未来添加。此外,in_array 在 PHP 中为您的$condition 检查也将更容易,array('Available/Unassigned', 'assigned')
  • 非常感谢。我会记住这一点

标签: php mysql sql select subquery


【解决方案1】:

您可以使用mysqli_num_rows() 为您提供查询返回的记录数。

    $result = mysqli_query($conn, $sql);
    $num_rows = mysqli_num_rows($result);

然后在您的 CONDITION 表单中为您运行查询的条件显示该值(如果已设置)。

另外提醒一下,您的 elseif 块中有一个小错字

elseif($state=='allstate' AND ($condition=='Available/Unassigned' OR 
$condition=='assigned' OR   $condition=='repair' OR 
$condition=='missingpart' OR $condition=='mmissingeq' OR 
// ...
// Should probably be
elseif($state=='allstate' AND ($condition=='Available/Unassigned' OR 
$condition=='assigned' OR   $condition=='repair' OR 
$condition=='missingpart' OR $condition=='missingeq' OR 

【讨论】:

  • 但是如何识别和计算条件类别的行数?例如,计算条件为“可用/未分配”的行?
  • 好吧,因为状态和条件表单是单选按钮,您只能为每个选择 1。所以我会用它作为我的 WHERE 子句参数,类似于你在 if 块的最后对 $sql 变量所做的事情。还是要在表单提交前显示行数?
  • 我现在有了一个想法。我将使用存储在 $state 和 $condition 中的会话。我忘了在上面包括在条件类别中显示的数量也将取决于状态(新、旧或未知状态),但我认为我也可以使用 $state 将其包含在 where 子句中来计算,例如,使用 mysqli_num_rows() 的“可用/未分配”。
  • 当用户单击另一个类似于 facebook 搜索的单选按钮时,页面会重新加载。
  • 嗯,不错!听起来你正在路上!