我有一个查询,我正在尝试针对单词数据库运行。查询必须返回包含另一个单词和给定字母的单词。它在PHP和mySQL中。
例如:
Word Given: Cruel
Letters Given: abcdty
在数据库中,我需要根据给出的字母和给定的单词找到“残忍”一词。它需要双向工作。因此,如果我有“atni”字母,如果它存在于数据库中,就会出现“Anticruel”。
我有一半工作,但给出的结果不正确:
SELECT word
FROM words
WHERE LOCATE( "cruel", word ) >0
AND word != "cruel"
AND word
REGEXP '[ybilteh]'
此查询的结果集:
"anticruelty"
"crueler"
"cruelest"
"crueller"
"cruellest"
"cruelly"
"cruelness"
"cruelnesses"
"cruelties"
"cruelty"
更新!!!
感谢Benjamin Morel,这已经越来越近了。
此查询:
SELECT word
FROM words
WHERE LOCATE( "t", word ) >0
AND word != "t"
AND word
REGEXP '^[ybilteh]*t[ybilteh]*$'
LIMIT 0 , 30
正确查找单词。但也包括双字母的单词。如“甜菜”。只有1“e”时可用。
答案 0 :(得分:1)
试试这个:
SELECT word
FROM words
WHERE word REGEXP '^[ybilteh]*cruel[ybilteh]*$'
AND word != 'cruel';
更新:让我们用PHP进行改进,这是怎么回事?
$word = 'cruel';
$letters = 'ybilteh';
$items = array("anticruelty", "crueler", "cruelest",
"crueller", "cruellest", "cruelly", "cruelness",
"cruelnesses", "cruelties", "cruelty");
$letters = str_split($letters);
foreach ($items as $item) {
$list = $letters;
// remove the original word (once)
$thisItem = preg_replace("/$word/", '', $item, 1);
for ($i=0; $i<strlen($thisItem); $i++) {
$index = array_search($thisItem[$i], $list);
if ($index === false) {
continue 2; // letter not available
}
unset($list[$index]); // remove the letter from the list
}
echo "$item\n"; // passed!
}
返回:残忍,残忍
您可能会找到更好/更简单的方法,但这应该可以做到!