SQL查询问题:[1]使用NOT vs<>计数(*)和[2]

时间:2016-08-08 17:03:23

标签: php mysql sql

我一直盯着这段代码,所以它开始流血了。因此,让我们做一些事情:

  1. 我是一个低级别的中级SQL用户,我仍在学习完成查询等的最佳方法
  2. 我一直在构建一个基于PHP的引用生成器工具,它与SQL数据库相关联
  3. 现在,我正在努力实现这一目标: 我想对已经创建的状态不是" Dead"," Duplicate"或" Signed"的引用结果进行分页。并且ID不等于999(因为我希望引号跳转到1000并且我最初没有正确构建数据库)

    以下是我所取得的成就: 我能够创建基本结构,它在第1页上运行得很好......然后一切都在侧面。我认为这与我的count(*)查询有关,但这似乎很好 - 功能很好,至少:

    $countQry = "SELECT COUNT(*) 
                 from needsassessment 
                 WHERE ID <> 999 
                   AND status <> 'Dead' 
                   AND status <> 'Duplicate' 
                   AND status <> 'Signed'";
    
    $countResult = $mysqli->query($countQry);
    while($rowQ = mysqli_fetch_array($countResult)) {
        $totalRows = $rowQ[0];
        $each = ceil($totalRows/$limit);
        $where = "WHERE ID > 0";
        if ($totalRows == 0) {
            echo "You have not created any quotes.";
        }
    }
    
    $limit = 15;
    if (isset($_GET['q']) && $_GET['q'] !== "") {
        $offset = $_GET['q'];
    } else {
        $offset = 0;
    }     
    
    $query = "SELECT * FROM needsassessment $where
              where $and 
                AND ID <> 999 
                AND NOT status = 'Dead' 
                AND NOT status = 'Duplicate' 
                AND NOT status = 'Signed' 
              ORDER BY ID DESC LIMIT $offset, $limit";
    
    $result = $mysqli->query($query);
    $row_cnt = mysqli_num_rows($result);
    if ($row_cnt == 0) {
        echo "You have not created any quotes."; die;
    }
    if (!isset($each)) {
        $each = $row_cnt/$limit;
    }
    
    if ($each > 1) {
        echo "<ul class='pagination'>";
        for($i=1,$y=0;$i<=$each,$y<=($each-1);$i++,$y++) {  
            echo "<li><a";
            if ($offset == ($y*15)) {echo ' class="active"';}
                echo " href='?q=".($y*15)."'>$i</a></li>";
            }
            echo "</ul>";
        }
    

    好的,这是我的问题:

    1. 我看到有人说使用PHP的mysqli_num_rows()是错误的 我应该使用SQL的COUNT(*)。为什么?是否有不同的结果或需要更长的时间?
    2. 页面发生了什么 2和3?当我进行行计数时,它说它看到15行但只有一行 正在显示。我有一些记录(即那些状态为 &#34;签名&#34;或者&#34; Dead&#34;)被排除在此列表之外且我是 认为这可能是问题,但它似乎并不重要 在第一页。
    3. 有什么区别 - 如果有的话 - 之间&#34; NOT&#34;和&#34;&lt;&gt;&#34;检查记录?
    4. 如果您有任何建议,或者我做了任何明显错误或效率低下的事情请告诉我,以便我能纠正:)
    5. 感谢所有使Stack Overflow真棒!

      编辑: 当然缺少一些代码:

      if (!isset($sst)) {
          $where = "";
          $sst = "";
      $countQry = "SELECT COUNT(*) from needsassessment WHERE ID <> 999 AND status <> 'Dead' AND status <> 'Duplicate' AND status <> 'Signed'";
      $countResult = $mysqli->query($countQry);
      while($rowQ = mysqli_fetch_array($countResult)) {
      $totalRows = $rowQ[0];
      $each = ceil($totalRows/$limit);
      $where = "WHERE ID > 0";
      if ($totalRows == 0) {echo "You have not created any quotes.";}
      }
      }
      else {
          if ($option !== "*") {
          $where = "WHERE ".$option." LIKE '%".$sst."%'";
          }
          if ($option == "*") {
          $where = "WHERE status LIKE '%".$sst."%' OR title LIKE '%".$sst."%' OR propType LIKE '%".$sst."%' OR pSType LIKE '%".$sst."%' OR createDate LIKE '%".$sst."%'";
          }
          $offset = 0;
      }
          if ($_SESSION['admin'] >= 1) {
          $and = "";
          }
          else {
          $and = "AND creatorID = '".$_SESSION['user']."'";
          }
      

0 个答案:

没有答案