【问题标题】:PHP Mysql Search QueryPHP Mysql 搜索查询
【发布时间】:2012-11-12 02:44:52
【问题描述】:

您好,我有一个简单的搜索查询,我面临的是当有人写下他想要搜索的用户的唯一名字时,我的查询会找到它,当有人只在输入中写下姓氏时发布它,它也显示了,但是当用户在输入中一起写名字和姓氏时,即使他/她存在也找不到用户。 $q 查询的最后一部分我写了名字和姓氏之类的部分不起作用我知道我的逻辑很糟糕,但是我该如何解决这个问题

    try {
        $q = "SELECT * FROM `members` WHERE `first_name` LIKE :search_string OR `last_name` LIKE :search_string OR `first_name` AND `last_name` LIKE :search_string";
        $q_do = $db->prepare($q);
        $q_do->execute( array("search_string"=>'%'.$query.'%') );
        $number = $db->query("SELECT FOUND_ROWS()")->fetchColumn();
    } catch(PDOException $e) {
        $log->logError($e." - ".basename(__FILE__));
    }

谢谢

【问题讨论】:

  • 这是用户写入搜索输入的内容。

标签: php mysql search pdo


【解决方案1】:

尝试使用 concat:

$q = "SELECT * FROM `members` WHERE `first_name` LIKE :search_string 
OR `last_name` LIKE     :search_string 
OR concat(`first_name` , ' ', `last_name`) LIKE :search_string";

【讨论】:

  • +1 是一个聪明的答案,它可能对提问者想要做的事情很好,但全文搜索仍然是一个更好的方法。
  • 当然可以,但名称可能少于 4 个字符,您必须为此编辑 my.cnf。您可以在两个字段上添加一个组合索引,以保持它的快速与大量的行。
  • 全文搜索或任何搜索引擎将是更好的选择。因为这些查询往往会很快变得复杂。
【解决方案2】:
SELECT * 
FROM `members` 
WHERE `first_name` LIKE :search_string 
   OR `last_name` LIKE :search_string 
   OR `first_name` AND `last_name` LIKE :search_string;

AND是一个运算符而不是一个连接符。

SELECT * 
FROM `members` 
WHERE `first_name` LIKE :search_string 
   OR `last_name` LIKE :search_string 
   OR CONCAT(`first_name`,' ', `last_name`) LIKE :search_string;

【讨论】:

    【解决方案3】:

    所以你不做的是:

    用户输入'First Last'

    你搜索:

    First like '%First Last%' or Last  like '%First Last%' ...
    

    您需要使用全文搜索索引。

    http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html

    或类似的东西

    http://sphinxsearch.com/

    【讨论】:

      【解决方案4】:

      试试这个:

      $query = explode(" ", $query);
      if(count($query)>1){
          $fname = $query[0];
          $lname = end($query);
      }else{
          $fname = $query[0];
          $lname = $query[0];
      }
      $q = "SELECT * FROM `members` WHERE `first_name` LIKE :fname OR `last_name` LIKE :lname";
      $q_do = $db->prepare($q);
      $q_do->execute( array('fname' => "%$fname%", 'lname' => "%$lname%") );
      

      【讨论】:

      • 永远不要这样做。使用适当的工具。全文搜索任何搜索引擎都会做得更好。你的解决方案会带来更多问题!
      【解决方案5】:

      最简单的搜索查询。试试这个它的工作人员。

      SELECT * FROM TableName WHERE title like '%Your Search Text%'

      【讨论】:

        猜你喜欢
        • 2011-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-29
        相关资源
        最近更新 更多