【问题标题】:MYSQL query for searching through ALL the fields?用于搜索所有字段的 MYSQL 查询?
【发布时间】:2011-04-17 09:48:48
【问题描述】:

听起来很愚蠢,有没有办法做这样的事情:

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

这里的*是指表格中的“所有字段”,而不是我一一指定...

【问题讨论】:

  • 您是否正在尝试构建全文索引?使用 apache lucene 和 apache solr 可能会更好。

标签: mysql


【解决方案1】:

一个查询是不可能的。

但是当你这样做时:

DESCRIBE table_name;

您会获得可以从中生成查询的字段名称。

Search in all fields from every table of a MySQL database 可能有用。

【讨论】:

  • 链接的问题正是我的问题...谢谢 wikeno
【解决方案2】:

这是一个结合一些 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;

【讨论】:

  • 应该注意,在很可能的情况下,您将搜索短语更改为用户输入(例如 $searchphrase = $_GET['query']),那么您需要使用 mysql_real_escape_string 来防止 SQL 注入.
【解决方案3】:

是的,它叫Full Text Search

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

【讨论】:

  • 嗯 - 嗨 Pablo - 我该如何使用它?听起来我需要修改我的列?
  • 全文没有帮助,您仍然需要枚举您搜索的所有字段。
  • @matt_tm,你不需要修改你的列,你只需要在你想要搜索的所有列上创建一个全文索引。这就像创建一个索引。
  • @Wikeno:是的。但我认为他在这里试图避免 HUGE where 子句,由 OR 条件连接......我可能是错的......
【解决方案4】:

我正在寻找这样的东西来搜索表的所有字段。虽然我的表中的数据较少,但我选择了“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;
}

【讨论】:

    【解决方案5】:

    这样使用

    select row_id from mytable where '%searched_text%' IN ('column1','column2','column3','column4','column5');
    

    【讨论】:

      【解决方案6】:

      此解决方案使 Ms Sql Server 通过链接服务器成为可能

      DECLARE @searchTxt VARCHAR(100) = 'searching text'
      
      DECLARE curr CURSOR LOCAL FAST_FORWARD READ_ONLY FOR
      select * from openquery (BITRIX, 'SELECT table_name, column_name FROM information_schema.columns where table_schema = ''bitrix_50'' and data_type = ''varchar'' and table_name not like ''b_mail%''')
      
      DECLARE @tName VARCHAR(100), @cName VARCHAR(100), @sql NVARCHAR(4000), @cnt INT
      
      OPEN curr
      
      FETCH NEXT FROM curr INTO @tName, @cName
      
      WHILE (@@FETCH_STATUS=0)
      BEGIN
      
          SET @sql = 'select @cnt=cnt from openquery (BITRIX, ''SELECT count(*) cnt FROM ' + @tName + ' WHERE ' + @cName + ' LIKE ''''%' + @searchTxt + '%'''''')'
      
          BEGIN TRY
      
              EXECUTE sp_executesql @sql, N'@cnt int OUTPUT', @cnt=@cnt OUTPUT
      
              IF (@cnt>0)
                  PRINT @sql
      
          END TRY
          BEGIN CATCH
              PRINT N'Error on: ' + @sql
          END CATCH
      
          FETCH NEXT FROM curr INTO @tName, @cName
      
      END
      
      CLOSE curr
      DEALLOCATE curr
      

      Access MySQL data from SQL Server via a Linked Server

      【讨论】:

      • 把它翻译成 SQL/PSM :-) 也比在 mysql 上工作。
      【解决方案7】:

      他是一个完整的解决方案,是对上述解决方案的修改,它对我有用,谢谢。

      <!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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-07
        • 2019-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-03
        相关资源
        最近更新 更多