SQL 使用分隔符获取所有可能的结果
SQL get all possible results using separators
我有包含相似词列表的数据库。我需要获得相似的词,我正在尝试使用这种方法来获得每个相似的词:
- 我在 mysql 查询中使用 LIKE 来获取相似的词。
- 仅使用 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 中获取所有匹配的条目,并根据搜索词对它们进行排序。
我有包含相似词列表的数据库。我需要获得相似的词,我正在尝试使用这种方法来获得每个相似的词:
- 我在 mysql 查询中使用 LIKE 来获取相似的词。
- 仅使用 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 中获取所有匹配的条目,并根据搜索词对它们进行排序。