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

时间:2017-10-19 12:27:16

标签: php mysql sql-like

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

  1. 我在mysql查询中使用LIKE来获得类似的单词。
  2. 使用LIKE还不够,所以我用%来创建每个可能的字符串以获得更多类似的结果。我不知道,我找不到是否有任何LIKE替代品可以找到更多相关的查询。
  3. 例如,为了找到像" EL"这样的类似单词,我正在使用此查询:

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

    它只返回一个结果,这不是我想要的结果。但是,如果我使用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();
    

    这些是我得到的(示例/类似)结果:

    EL,埃斯皮内尔,EL,车轮,埃斯皮内尔,轮子

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

    对于单个查询,我使用:

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

    但是我认为多次查询和过滤会比单次查询花费更多时间,因此我正在寻找一种方法来获取单个查询的所有结果,甚至更好,而不会创建所有可能的字符串变体。

1 个答案:

答案 0 :(得分:0)

如上所述,您只需要运行最后一个查询。为了获得所需的结果顺序(相关性),您需要通过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');

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