MYSQL запрос для поиска по всем полям?

Как бы глупо это ни звучит, есть ли способ сделать что-то вроде этого:

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

под * Здесь я подразумеваю "все поля" в таблице, вместо того, чтобы указывать их по одному...

6 ответов


это невозможно с одним запросом.

Если вы:
DESCRIBE table_name;

вы получаете имена полей, из которых можно создать запрос.

поиск во всех полях из каждой таблицы базы данных MySQL может быть полезно.


вот решение в сочетании с некоторым 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;

Да, это называется Полнотекстовый Поиск.

вы можете использовать встроенный полнотекстовый поиск MySQL или использовать отдельный продукт для индексирования текста, такой как сервера Apache Lucene и (мой личный фаворит).


Я искал что-то подобное для поиска во всех полях таблицы. Хотя в моей таблице меньше данных, поэтому я выбрал ответ "Килиан Линдберг" и сделал функцию 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');

Он является полным решением, является модификацией вышеуказанного решения, это сработало для меня, спасибо.

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