SQL 使用分隔符获取所有可能的结果

SQL get all possible results using separators

我有包含相似词列表的数据库。我需要获得相似的词,我正在尝试使用这种方法来获得每个相似的词:

  1. 我在 mysql 查询中使用 LIKE 来获取相似的词。
  2. 仅使用 LIKE 是不够的,所以我将每个可能的字符串都用 % 来获得更相似的结果。我不知道,我找不到是否有任何 LIKE 替代方法来查找更多相关查询。

例如,要查找类似 "EL" 的词,我正在使用此查询:

SELECT * FROM `words` WHERE word LIKE 'el' OR word LIKE '%el' OR word LIKE '%el%' OR word LIKE '%e%l%'

而且returns只有一个结果,这不是我想要的。但是,如果我使用 multi_query 和多个查询,例如:

SELECT * FROM `words` WHERE word LIKE 'el';
SELECT * FROM `words` WHERE word LIKE '%el';
SELECT * FROM `words` WHERE word LIKE '%el%';
SELECT * FROM `words` WHERE word LIKE '%e%l%';

为了获取这些,我使用:

if ($con->multi_query($query)) {
do {
    /* almacenar primer juego de resultados */
    if ($result = $con->store_result()) {
        while ($row = $result->fetch_row()) {
            printf("%s\n", $row[0]);
        }
        $result->free();
    }
    /* mostrar divisor */
    if ($con->more_results()) {
        printf("-----------------\n");
    }
    } while ($con->next_result());
}

/* cerrar conexión */
$con->close();

这些是我得到的(example/similar)个结果:

el,espinel,el,wheels,espinel,wheels

它会得到所有可能的结果。当然,我需要过滤重复项,但我会全部获取。

对于单个查询,我使用:

$result = $con->query($query);
$row = mysqli_fetch_row($result);

但是我认为多个查询和过滤比单个查询需要更多时间,所以我正在寻找一种方法来获得单个查询的所有结果,甚至更好,而无需创建所有可能的字符串变体。

如前所述,您只需要 运行 最后一个查询。为了获得所需的结果顺序(相关性),您需要通过 php.

实现该逻辑
$keyword = 'Your search term';

function getRelevance($value,$keyword){
    $value = strtolower($value);
    $keyword = strtolower($keyword);

    $index = strpos($value, $keyword);
    $word_index = strpos($value, ' '.$keyword);

    if($index==0) // first word starts with keyword
        return 3;
    else if($word_index!==false) // any word starts with keyword
        return 2;
    else if($index!==false) // keyword matches anywhere
        return 1;
    else
        return 0;
}

$keyword = mysqli_real_escape_string($con, $keyword); // prevent SQL injection
$res = $con->query("SELECT * FROM words WHERE `word` LIKE '%$keyword%'");

$words = array();
while($line = $res->fetch_assoc()){
    $line['relevance'] = getRelevance($line['word'],$keyword); // assign relevance value based on the "el" query and the elements word
    $words[] = $line;
}

function compareRelevance($a,$b){
    return $b['relevance'] - $a['relevance'];
}
usort($words,'compareRelevance');

这将从 'words' table 中获取所有匹配的条目,并根据搜索词对它们进行排序。