如何找到与字符串匹配的数据库行?

e4eetjau  于 2021-06-19  发布在  Mysql
关注(0)|答案(3)|浏览(321)

我有一个10万行的数据库表和一个100项的数组。我需要找出是否在users表username行中找到数组项。
我的数据库表用户

| id | username | fullname |
  1      John    John Smith
  2      Elliot  Jim Elliot
  3      Max     Max Richard

我的阵法是这样的

[
   {
      string: 'Hello, this is Elliot from downtown Las Vegas!'
   },

   {
      string: 'Hey how are you?'
   }
]

我的想法是对users表中的每一行(100k条记录)执行foreach循环,并查找它是否与数组中的匹配,但速度太慢了。

foreach ($MyArray as $Array) {
    foreach ($dbrows as $dbrow) {
        if (strpos($Array['string'], $dbrow['username']) !== false) {
            echo 'found it!';

            break;
        }
    }
}
lf5gs5x2

lf5gs5x21#

我认为更好的方法是将搜索数组拆分为单词,并在查询中使用它,例如:

<?php
// Assuming your search array is $search...
$words = array ();
foreach ( $search as $text)
{
  $words = array_merge ( $words, explode ( " ", trim ( preg_replace ( "/[^0-9a-z]+/i", " ", $text))));
}
$words = array_unique ( $words);
$in = "";
foreach ( $words as $text)
{
  $in .= ",'" . $mysqli->real_escape_string ( $text) . "'";
}
if ( ! $result = $mysqli->query ( "SELECT * FROM `Users` WHERE `username` IN (" . substr ( $in, 1) . ")"))
{
  echo "MySQL error!";
}
// Results at $result
?>
bxfogqkk

bxfogqkk2#

这将是一个有点击中和错过,因为你可能会发现用户与各种奇怪的名字,符合正常的话,这种方法分裂成词的输入,然后使用它们形成一个新的名称 in 子句来搜索数据库。所以它只看匹配的记录而不是所有的记录。。。

$search = 'Hello, this is Elliot from downtown Las a1 Vegas!';
$words = str_word_count($search, 1);
$bind  = str_repeat("?,", count($words));
$bind  = trim($bind, ",");

$query = $conn->prepare("select * from users where username in ($bind)" );
$types = str_repeat("s", count($words));
$query->bind_param($types, ...$words);
$query->execute();
$res = $query->get_result();
while($row = $res->fetch_assoc())   {
    // Process result
}

它还使用准备好的语句,这是所有 $bind 以及 $types 正在处理。如果你看 $query 你会看到它是如何建立起来的。

idfiyjo8

idfiyjo83#

可以使用正则表达式:

<?php

    $query_string = "bla bla bla...";

    $qry = $mysqli_query($conn, "SELECT *FROM table WHERE username REGEXP '$query_string'");

?>

正则表达式分别匹配表中的数据。

相关问题