【发布时间】:2011-04-17 09:48:48
【问题描述】:
听起来很愚蠢,有没有办法做这样的事情:
select row_id from mytable where * like '%searched_text%';
这里的*是指表格中的“所有字段”,而不是我一一指定...
【问题讨论】:
-
您是否正在尝试构建全文索引?使用 apache lucene 和 apache solr 可能会更好。
标签: mysql
听起来很愚蠢,有没有办法做这样的事情:
select row_id from mytable where * like '%searched_text%';
这里的*是指表格中的“所有字段”,而不是我一一指定...
【问题讨论】:
标签: mysql
一个查询是不可能的。
但是当你这样做时:
DESCRIBE table_name;
您会获得可以从中生成查询的字段名称。
Search in all fields from every table of a MySQL database 可能有用。
【讨论】:
这是一个结合一些 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;
【讨论】:
是的,它叫Full Text Search。
您可以使用 MySQL 内置的全文搜索,或使用单独的产品来进行文本索引,例如 Apache's Lucene(我个人最喜欢的)。
【讨论】:
我正在寻找这样的东西来搜索表的所有字段。虽然我的表中的数据较少,但我选择了“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;
}
【讨论】:
这样使用
select row_id from mytable where '%searched_text%' IN ('column1','column2','column3','column4','column5');
【讨论】:
此解决方案使 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
【讨论】:
他是一个完整的解决方案,是对上述解决方案的修改,它对我有用,谢谢。
<!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>
【讨论】: