【问题标题】:MySQL Query using UNION - PHP PDO issues使用 UNION 的 MySQL 查询 - PHP PDO 问题
【发布时间】:2014-01-20 20:03:52
【问题描述】:

我已经建立了一个基本的搜索引擎,它几乎可以正常工作。我在查询中使用UNION,以便在blogpages 两个表中搜索特定值。我也在使用 PDO 风格。一共有13行。当我使用关键字blah 执行查询时,该关键字在两个表的每一列中都可以找到。我只从 SELECT COUNT(*) FROM blog 得到 5 个结果,而从 SELECT COUNT(*) FROM pages 没有得到任何结果。此外,我正在使用存储关键字值的:searchquery => $serachquery 的准备语句,但是当回显该值时,我得到:searchquery 而不是blah。如何显示正确的结果? DEMO

PHP

<?php
include("db_con/db_con.php");
$search_output = "";
if(isset($_POST['searchquery']) && $_POST['searchquery'] != ""){
  $searchquery = preg_replace('#[^a-z 0-9?!]#i', '', $_POST['searchquery']);
  if($_POST['filter1'] == "All Tables"){
   $sqlCommand = "(SELECT COUNT(*) FROM blog WHERE blog_title LIKE :searchquery OR blog_body LIKE :searchquery) UNION (SELECT COUNT(*) FROM pages WHERE page_title LIKE :searchquery OR page_body LIKE :searchquery) ";
  }
  $sql_prepare = $db_con->prepare($sqlCommand);
  if($sql_prepare->execute( array("searchquery"=>'%'.$searchquery.'%') )){
    $count = $sql_prepare->fetchColumn();
    if($count > 1){
      $search_output .= "<hr />$count results for <strong>$searchquery</strong><hr />$sqlCommand";
    } else {
      $search_output = "<hr />0 results for <strong>$searchquery</strong>$sqlCommand<hr />";
    }
  }
}
?>

HTML

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
Search For:
  <input name="searchquery" type="text" size="44" maxlength="88">
Within:
<select name="filter1">
<option value="All Tables">All Tables</option>
</select>
<input name="myBtn" type="submit">

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

    我做了一个 sqlfiddle: http://sqlfiddle.com/#!2/82482/3

    如您所见,您的查询返回两行 - 这可能是您的问题。 您可以增强您的查询以总结这两个结果:

    SELECT SUM(results)
    FROM 
          (SELECT COUNT(*) as results
          FROM blog 
          WHERE blog_title LIKE '%blah%' OR blog_body LIKE '%blah%' 
          UNION
          SELECT COUNT(*) as results
          FROM pages 
          WHERE page_title LIKE '%blah%' OR page_body LIKE '%blah%') a
    

    【讨论】:

      【解决方案2】:

      首先UNION发生*请参阅下面的注释)在结果集中为您提供两行。

      |计数(*) | |-----------| | 5 | -- 使用 fetchColumn() 你只读取第一行的值 | 8 |

      但您只获取第一行的值。这就是为什么你总是得到5 而不是13

      注意:在您的特定情况下使用UNION无效,因为它只返回不同的值。这意味着如果两个选择碰巧具有相同的值(例如5),那么您的结果集将看起来像这样

      |计数(*) | |-----------| | 5 |

      而不是

      |计数(*) | |-----------| | 5 | | 5 |

      您可能已经使用 UNION ALL 而不是 UNION 并遍历结果集并在 php 中得到总和,或者使用带有聚合函数 SUM() 的外部 SELECT


      现在要获得总数,您只需这样做

      SELECT 
      (
        SELECT COUNT(*) 
                FROM blog 
               WHERE blog_title LIKE :searchquery 
                  OR blog_body  LIKE :searchquery
      ) + 
      (
        SELECT COUNT(*) 
          FROM pages 
         WHERE page_title LIKE :searchquery
            OR page_body LIKE :searchquery
      ) total
      

      输出:

      |总计 | |-------| | 13 |

      这里是SQLFiddle演示


      现在就 php 代码而言

      1) 这张支票

      if($count > 1)...
      

      是不正确的,实际上是无用的,因为您的搜索条件只能合法地获得一次命中,而 COUNT() 总是返回一个值,无论是 0 还是其他一些正整数。因此,您可以简单地留下唯一的一行

      $search_output .= "<hr />$count results for <strong>$searchquery</strong><hr />$sqlCommand";
                                                                                     ^^^^^^^^^^^
      

      2) 您在输出查询时会看到占位符 :search query,因为您从 $sqlCommand 变量输出原始 sql 查询。

      【讨论】:

      • 现在更有意义了!为什么我只得到一个结果集
      • 如何显示查询显示的值? 这是一个很好的通用解决方案stackoverflow.com/questions/7716785/…
      • 在这种特殊情况下(对于此特定查询),它可能只是一个海峡前锋str_replace。看看这个codepad 例子
      • 很好,但我的意思是如何显示查询结果。表格中的数据?
      • 知道了。这就是UNION ALL 发挥作用的地方。请参阅sqlfiddle 示例。然后遍历结果集并呈现搜索结果。
      【解决方案3】:

      现在替换这一行:

      $count = $sql_prepare->fetchColumn();
      

      用这个:

      $count = 0;
      foreach($sql_prepare->fetchall() as $records)
      {
          $count += $records[0];
      }
      

      它返回所有行的计数;

      【讨论】:

        猜你喜欢
        • 2021-11-20
        • 1970-01-01
        • 2012-08-11
        • 2016-01-08
        • 2012-11-10
        • 1970-01-01
        • 2015-12-08
        • 2010-10-09
        • 1970-01-01
        相关资源
        最近更新 更多