2010-09-26 160 views
8

像听起来那么愚蠢,是有没有办法做这样的事情:搜索所有字段的MYSQL查询?

select row_id from mytable where * like '%searched_text%'; 

由*这里我指的是在表中“所有字段”,而不是我一个指定它们一个...

+0

您是否正在尝试构建全文索引?使用apache lucene和apache solr可能会更好。 – 2014-01-15 14:56:11

回答

1

是的,它叫Full Text Search

您可以使用MySQL的内置全文搜索功能,或使用单独的产品来为您做文本索引,如Apache's Lucene(我个人最喜欢的)。

+0

umm - 你好巴勃罗 - 我如何使用它?这听起来像我需要修改我的列? – siliconpi 2010-09-26 13:42:58

+0

全文不起作用,你仍然需要枚举你搜索的所有字段。 – Wikeno 2010-09-26 13:48:44

+0

@matt_tm,你不需要修改你的列,你只需要在你想要的所有列上创建一个FULL TEXT索引搜索。这就像创建一个索引。 – 2010-09-26 14:57:03

4

这是一个解决方案,结合一些PHP来搜索特定表中的所有字段。

include("db_con.php"); 
//search all fields 
$searchphrase = "banan"; 
$table = "apa303"; 
$sql_search = "select * from ".$table." where "; 
$sql_search_fields = Array(); 
$sql = "SHOW COLUMNS FROM ".$table; 
$rs = mysql_query($sql); 
    while($r = mysql_fetch_array($rs)){ 
     $colum = $r[0]; 
     $sql_search_fields[] = $colum." like('%".$searchphrase."%')"; 
    } 

$sql_search .= implode(" OR ", $sql_search_fields); 
$rs2 = mysql_query($sql_search); 
$out = mysql_num_rows($rs2)."\n"; 
echo "Number of search hits in $table " . $out; 
+1

需要注意的是,在很可能的情况下,您将搜索短语更改为用户输入(例如$ searchphrase = $ _GET ['query']),那么您需要使用mysql_real_escape_string来防止SQL注入。 – Aron 2014-12-13 10:41:49

-2

他是一个完整的解决方案,,是上述方案的修改,这为我工作,谢谢。

<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title></title> 
    </head> 
    <body> 
     <?php 
     include('config.php'); 
     $searchphrase = "adsa"; 
     $table = "tenders"; 
     $sql_search = "select * from " . $table . " where "; 
     $sql_search_fields = Array(); 
     $sql = "SHOW COLUMNS FROM " . $table; 
     $rs = mysql_query($sql); 
     while ($r = mysql_fetch_array($rs)) { 
      $colum = $r[0]; 
      $sql_search_fields[] = $colum . " like('%" . $searchphrase . "%')"; 
     } 
     $sql_search .= implode(" OR ", $sql_search_fields); 
     $rs2 = mysql_query($sql_search); 
     $out = mysql_num_rows($rs2) . "\n"; 
     echo "Number of search hits in $table " . $out."<br />"; 
     while ($results = mysql_fetch_array($rs2)){ 
      print $results[0]."<br />"; 
     } 
     ?> 
    </body> 
</html> 
0

我看起来像这样在表中的所有字段中搜索。尽管我的桌子数据较少,所以我选择了“Kilian Lindberg”的答案,并使用他的想法创建了PDO功能。在这个函数中,我们可以在参数中发送'搜索字符串'和'表名',它会返回我们可以按照我们的要求进一步使用的SQL字符串。认为在大表中它可能会放慢这个过程。

function columnsTable($Search, $Table){ 
    include("PDO_conn_detail.php"); /* your PDO mysql connection file */ 
    $srchSQLstr = "SELECT * FROM $Table WHERE "; 
    $tableFields = Array(); 

    $colSQL = $conn->prepare("SHOW COLUMNS FROM $Table"); 
    $colSQL->execute(); 
    while ($result_colSQL = $colSQL->fetch(PDO::FETCH_ASSOC)){ 
      $tableFields[] = $result_colSQL[Field]." LIKE ('%".$Search."%')"; 
     } 

    $srchSQLstr .= implode(" OR ", $tableFields); 
    return $srchSQLstr; 
}