如何在PHP MySQL预准备语句中选择字符串包含数组中所有项的位置?[duplicate]

4si2a6ki  于 2023-01-16  发布在  PHP
关注(0)|答案(2)|浏览(81)
    • 此问题在此处已有答案**:

Get rows matching all items from an array(4个答案)
MySQL select all elements in array(3个答案)
昨天关门了。
这篇文章是8小时前编辑并提交审查的。
假设我有这个数组:$myArray =["您好"、"和"];
然后我有一个表,像这样:
| 身份证|正文|
| - ------|- ------|
| 1个|"你好,拉里!"|
| 第二章|"你好,鲍勃,你好吗?"|
| 三个|"你在忙什么?"|
如何运行如下查询

$stmt = $conn->prepare("SELECT text FROM myTable WHERE text CONTAINS allItemsIn(a) LIMIT 10");
$stmt->bind_param("a", $myArray);
$stmt->execute();

理想情况下,我希望查询只返回id为2的行,因为文本中同时包含字符串"hello"和"and"。我不希望数组中项的顺序很重要,所以即使数组中的"hello"和"and"反过来,它仍然应该返回行2。
我考虑过创建一个for循环,并针对$myArray中的每个项运行一个查询,其中的文本包含$myArray给定索引中的项,但是,我意识到这可能会变得相当慢,特别是在$myArray包含大量项的情况下。
一些要求类似问题答案的帖子使用WHERE x IN。我不能使用这个,因为文本永远不会出现在$myArray中的任何项目中,因为文本可能比$myArray中的一些项目更长。

xnifntxz

xnifntxz1#

您可以通过为搜索字符串中的每个单词添加一个LIKE并使用一个AND将它们连接起来来实现这一点。

$query = "SELECT text FROM myTable WHERE ";
foreach($myArray as $word) {
    $query .= "text LIKE '%$word%' AND ";
}
$query = rtrim($query, " AND ");
$query .= " LIMIT 10";

$stmt = $conn->prepare($query);
$stmt->execute();

但是,如果您希望按搜索字符串中的任何单词进行匹配,并根据匹配数量对它们进行排序:

$query = "SELECT text, COUNT(*) as matches FROM myTable WHERE ";
foreach($myArray as $word) {
    $query .= "text LIKE '%$word%' OR ";
}
$query = rtrim($query, " OR ");
$query .= " GROUP BY text ORDER BY matches DESC LIMIT 10";

$stmt = $conn->prepare($query);
$stmt->execute();

对于类似以下的搜索词:“hello,你将如何处理此问题?”生成的查询如下所示:

SELECT
    text,
    COUNT(*) as matches FROM myTable WHERE 
FROM
    myTable
WHERE
    text LIKE '%hello%'
    OR text LIKE '%how%'
    OR text LIKE '%would%'
    OR text LIKE '%you%'
    OR text LIKE '%handle%'
    OR text LIKE '%this%'
GROUP BY
    text
ORDER BY
    matches DESC
LIMIT 10

你应该去掉非字母数字字符,如标点符号,大多数搜索引擎也会去掉常见的单词,如“the”,“is”和”but”(由于某种原因被称为“停止词”),因为它们的使用非常频繁,往往导致返回不太相关的项目,它也使查询速度更快。

zzlelutf

zzlelutf2#

可以使用内聚将数组转换为字符串。如下所示:

$myArray = ["hello", "and"];
$myText = '%'.implode($myArray, '%').'%';

$stmt = $conn->prepare("SELECT text FROM myTable WHERE text like :a LIMIT 10");
$stmt->bind_param("a", $myText);
$stmt->execute();

相关问题