如何消除MySQL中重复的搜索结果


How to eliminate duplicate search results in MySQL?

我在使用PHP和SQL显示数据库中的文本时遇到一些问题。下面是一个类似于我的脚本。

$search_split = explode(" ", $search); //$search is what user entered
foreach ($search_split as $searcharray) {
    $searched = mysqli_query($connect, "SELECT * FROM people WHERE `description` LIKE '%$searcharray%'");
    while($info = mysqli_fetch_array($searched)) {
    echo $info['description'];
    }
}

因此,例如,用户输入"他是男性"。我使用"爆炸"功能将这个词分成三部分:"他"、"是"answers"男性"。之后,我在数据库中搜索与这三个单词相似的单词。但是,如果一行包含所有这三个单词,它将显示该行三次。如何使其只显示一次?

您可以这样做:

$search = 'test search me';
$search_split = array_map(function($piece) use ($mysqli_connection){
    return "'%" . $mysqli_connection->real_escape_string($piece) . "%'";
}, explode(' ', $search)); //$search is what user entered
$search_split = implode(' OR `description` LIKE ', $search_split);
$sql = "SELECT * FROM people WHERE `description` LIKE $search_split";
echo $sql; // SELECT * FROM people WHERE `description` LIKE '%test%' OR `description` LIKE '%search%' OR `description` LIKE '%me%'
$searched = mysqli_query($connect, $sql);

你能使用全文搜索吗?

向表添加全文索引

ALTER TABLE people ADD FULLTEXT(description);

然后你可以使用像这样的查询

SELECT * 
FROM people 
WHERE 
MATCH ( description ) 
AGAINST ('+He +is +male' IN BOOLEAN MODE)

首先将结果存储到一个数组中,然后显示它。请参阅下面的代码。

$search_split = explode(" ", $search); //$search is what user entered
foreach ($search_split as $searcharray) {
    $searched = mysqli_query($connect, "SELECT * FROM people WHERE `description` LIKE '%$searcharray%'");
    while($info = mysqli_fetch_array($searched)) {
     $results[$info['YOUR_PRIMARY_KEY']] = $info['description']; // this will over write your previous record
    }
}
foreach($results as $result){
  echo $result;
}

现在每条记录只显示一次。

您已经将数据库查询放入foreach循环中,该循环循环3次(使用当前数据:he、is和male)。您想要做的是将所有搜索变量放在一个查询中,类似于:

$search_split = explode(" ", $search); //$search is what user entered
$querypart = "'%" . implode("%' AND '%", $search_split) . "%'"; // use OR or AND, to your liking
$searched = mysqli_query($connect, "SELECT * FROM people WHERE `description` LIKE " . $querypart);
while($info = mysqli_fetch_array($searched)) {
    echo $info['description'];
}

这不需要对查询输入进行任何转义/清除,请注意。。。

$result = array();    
$search_split = explode(" ", $search); //$search is what user entered
    foreach ($search_split as $searcharray) {
        $searched = mysqli_query($connect, "SELECT * FROM people WHERE `description` LIKE '%$searcharray%'");
        while($info = mysqli_fetch_array($searched)) {
            $result[] = $info['description'];
        }
    }
$finalres = array_unique($result);

因此,finalres包含唯一的结果

for($i = 0; $i < count($finalres); $i++)
    echo $finalres[$i];