1

假设我检查是否

 $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

谢谢

4

6 回答 6

3

可能的组合数量为n!(您的示例中为 120),因此检查此字符串是否已存在是一项非常复杂的任务。
我建议使用以下算法:

  • StringHash在表格中添加新列
  • 在插入您的字符串时(例如按字母顺序),计算其哈希值并存储在StringHash
    "how can i do this" => "can do how i this" => md5("can+do+how+i+this")
  • 如果要检查数据库中是否存在某个字符串,则再次如上所述计算其哈希并查询数据库YourTable.StringHash
于 2012-04-25T07:50:08.993 回答
2

如果您只想在 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,检查字数,你就完成了。但我不确定这是一个很好的解决方案:)

于 2012-04-25T08:18:52.290 回答
0

您可以询问您正在搜索的字符串是否包含:"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
     }
于 2012-04-25T07:23:33.030 回答
0

应该是mysql中的通配符调用

select * From tablename Where columnname LIKE '%how%' 
于 2012-04-25T07:30:48.687 回答
0

如果您使用的是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 tablenamewhere 并运行该查询。

谢谢

于 2012-04-25T07:49:21.573 回答
0

你可以使用正则表达式首先创建一个这样的函数

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);
于 2018-10-16T00:02:22.763 回答