Php MySQL根据所有字段的相关性进行搜索

Php MySQL根据所有字段的相关性进行搜索,php,mysql,sql,Php,Mysql,Sql,我相信这是可能的,但我认为写起来可能非常复杂。我想通过以下方式搜索每个字段: ='SearchTerm' 然后 Like%SearchTerm 然后 像SearchTerm% 最后 类似于%SearchTerm%。我想在我表中的每个字段上运行它,大约有30或40个字段。有没有一种简单的方法可以在多个字段上运行它,或者我必须声明每个字段 我想我以前见过一个查询,其中%query%query%等之间的不同匹配项通过分配一个整数值进行排序,然后以此排序。对于这样的查询,这可能吗 非常感谢您在正确方向上

我相信这是可能的,但我认为写起来可能非常复杂。我想通过以下方式搜索每个字段:

='SearchTerm'
然后
Like%SearchTerm
然后
像SearchTerm%
最后
类似于%SearchTerm%
。我想在我表中的每个字段上运行它,大约有30或40个字段。有没有一种简单的方法可以在多个字段上运行它,或者我必须声明每个字段

我想我以前见过一个查询,其中%query%query%等之间的不同匹配项通过分配一个整数值进行排序,然后以此排序。对于这样的查询,这可能吗


非常感谢您在正确方向上提供的任何建议和帮助。

您应该对要搜索的字段使用全文索引,并使用匹配而不是LIKE%%。它的速度更快,并根据相关性返回结果。更多信息请点击此处:


您确实应该有某种id来选择表中的行

你应该把一列

id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
那你可以用

SELECT * FROM table WHERE column1 LIKE "%SearchTerm%" AND id BETWEEN 1 AND 40 

我做了一些与您描述的非常相似的事情(在php和mysql中)

这是我的密码:

$search = trim($_GET["search"]);
$searches = explode(" ",$search);
$sql = "SELECT *,wordmatch+descmatch+usagematch+bymatch as `match` FROM (SELECT id,word,LEFT(description,100)as description, 
         IFNULL((SELECT sum(vote)
                 FROM vote v
                 WHERE v.definition_id = d.id),0) as votecount,
            ";
$sqlword = "";
$sqldesc = "";
$sqlusage = "";
$sqlby = "";
foreach ($searches as $value) {
    $value = mysqli_real_escape_string($con,$value);
       $sqlword = $sqlword . "+ IFNULL(ROUND((LENGTH(word) - LENGTH(REPLACE(UPPER(word), UPPER('$value'), '')))/LENGTH('$value')),0)";
       $sqldesc = $sqldesc . "+ IFNULL(ROUND((LENGTH(description) - LENGTH(REPLACE(UPPER(description), UPPER('$value'), '')))/LENGTH('$value')),0)";
     $sqlusage = $sqlusage . "+ IFNULL(ROUND((LENGTH(`usage`) - LENGTH(REPLACE(UPPER(`usage`), UPPER('$value'), '')))/LENGTH('$value')),0)";
       $sqlby = $sqlby     . "+ IFNULL(ROUND((LENGTH(`by`) - LENGTH(REPLACE(UPPER(`by`), UPPER('$value'), '')))/LENGTH('$value')),0)";
}     
$sql = $sql . $sqlword ." as wordmatch,"
            . $sqldesc ." as descmatch,"
            . $sqlusage ." as usagematch,"
            . $sqlby ." as bymatch 
        FROM definition d
        HAVING (wordmatch > 0 OR descmatch > 0 OR usagematch > 0 OR bymatch > 0)
        ORDER BY 
        wordmatch DESC,
        descmatch DESC,
        usagematch DESC,
        bymatch DESC,
        votecount DESC)T1";
$queries[] = $sql;
$result = mysqli_query($con,$sql);
你可以在工作中看到这一点,这是我搜索“乔治·麦莉·塞勒斯”时发现的
它所做的是分解搜索字符串以查找每个单词,并返回每个单词在我的每个列中出现的次数,然后我按顺序让相关性(优先级)首先返回。所以在我的例子中,
word
字段的相关性最高,然后是
description
字段,然后是
usage
字段,然后是
by
字段。

在此版本的代码之前,我使用的是
LIKE
,但它没有给我出现次数的计数,因为我希望搜索词出现次数最多的行首先返回到其他行。

没有问题,“查询LIKE%query和LIKE query%”是什么意思?查询是否表示字段名?@Rottingham No.它表示搜索术语我已更改了措辞以尝试和帮助。您为什么要这样做?如果你只是通过
像%query%
那样搜索,它会返回相同的结果?很困惑,但也许全文搜索就是你想要的:顺便说一句。。如果您使用的是innodb表,但尚未升级到5.6,则需要执行此操作,或者将表更改为MyISAM,以便提供全文索引。介于1和40之间的值实现了什么?我已经更新了查询,现在应该可以工作了。只要你有一个id列,它就会在整个列中显示你的搜索词。谢谢,但最后一节到底做了什么?例如,表的中间部分应该有一个名为id的列(这样您就可以识别每一行)。您应该使id列成为主键和增量。所以第一行的id应该是1。。。第40行的id为40(例如)。所以“介于1和40之间”只是在每一行中查找搜索词。我想搜索所有行,尽管这看起来很疯狂。查询不可能具有任何级别的操作效率。否则,您如何从每个字段中获取发生次数?我想知道是否还有其他方法。你怎么知道他想计算发生次数,这在问题中没有具体说明。也许他没有。但是你知道另一种改进我的查询的方法吗?我甚至不想尝试。我会使用全文搜索。