假设我检查是否
$strig = "how can i do this";
我的数据库中已经存在所有单词顺序选项?比如:“我怎么能这样做”或“我能怎么做”……
我的数据库看起来像:
id string
1 how can i do this
2 hello how are you
3 how i can do this world
4 another title
etc etc
谢谢
可能的组合数量为n!
(您的示例中为 120),因此检查此字符串是否已存在是一项非常复杂的任务。
我建议使用以下算法:
StringHash
在表格中添加新列StringHash
:"how can i do this" => "can do how i this" => md5("can+do+how+i+this")
YourTable.StringHash
如果您只想在 sql 中解决此问题,这是一个棘手的问题,但除此之外:
正如@er.anuragjain 所说,您可以使用 进行查询LIKE %word%
,但您的示例“3”也会受到影响。
因此,如果您有这样的查询:
SELECT * FROM table WHERE
column LIKE '%how%'
AND column LIKE '%can%'
AND column LIKE '%i%'
AND column LIKE '%do%'
AND column LIKE '%this%'
然后你也得到数字3。所以你需要检查是否没有其他单词。您可以通过检查字数来做到这一点(如果您有 5 个单词并且所有单词都在其中,那么您就完成了。)。
检查字数并非易事,但有一个窍门。来自多个来源*:
SELECT LENGTH(total_words) - LENGTH(REPLACE(total_words, ' ', ''))+1
FROM tbl_test;
应该做的伎俩。所以检查LIKE
's,检查字数,你就完成了。但我不确定这是一个很好的解决方案:)
您可以询问您正在搜索的字符串是否包含:"how" and "can" and "I" and "do" and "this"
类似这样的内容:(我不知道 mysql 中的语法,但请参阅概念)
if(string.contain("how")&&
string.contain("can")&&
string.contain("I")&&
string.contain("do")&&
string.contain("this"))
{
//you find the string
}
应该是mysql中的通配符调用
select * From tablename Where columnname LIKE '%how%'
如果您使用的是mysql,那么试试这个..
select * from tablename where columnname Like '%how%' AND columnname LIKE '%can%' AND columnname LIKE '%I'% AND columnname LIKE '%DO'% AND columnname LIKE '%This'%;
在这里,如果您有动态值,$string
则首先将其转换为按空间拆分的数组。然后从数组中创建一个$condition
变量并将其附加到 select * from tablename
where 并运行该查询。
谢谢
你可以使用正则表达式首先创建一个这样的函数
public function part($str){
$str = str_replace('',' ',$str);
$arr = explode(' ',$str);
$rejex = '';
foreach($arr as $item){
$rejex .= "(?=.*$item)";
}
return $rejex;
}
然后使用 sql 正则表达式
$sql = "SELECT * FROM `table` WHERE `column` REGEXP ".part($str);