1

我正在用 PHP 和 MySQL 构建一个搜索系统,并且有人要求我做一些有趣的事情。所以,假设我有一个假设表results(在我的系统中,顺便说一下,它是一个视图)......

id    text
1     "foo"
2     "foo bar"
3     "foo man choo"
4     "bar choo"

...和一个非常容易理解的SELECT查询:

SELECT r.id, r.text
    FROM results AS r
    WHERE r.text REGEXP 'foo|bar|choo'
    AND r.text NOT REGEXP 'man'

有没有这样一种方法,即使它意味着交换它REGEXPLIKE我可以在这个文本旁边返回一个整数列,它返回每行的匹配数text,所以我可以通过相关性/匹配数来排序这个查询,所以结果表如下所示?:

id    text          matches
2     "foo bar"     2
4     "bar choo"    2
1     "foo"         1
4

2 回答 2

1

您可以通过将值相加来做到这一点:

SELECT r.id, 
       r.text, 
       ((r.text REGEXP 'foo') +
        (r.text REGEXP 'bar') +
        (r.text REGEXP 'choo')
       ) as matches 
FROM results AS r
WHERE r.text REGEXP 'foo|bar|choo'
AND r.text NOT REGEXP 'man'

比较(在 MySQL 中)评估为 0(假)或 1,您可以将它们加在一起。

于 2013-07-02T14:57:25.483 回答
0

也许像

SELECT r.id, 
       r.text, 
       r.text REGEXP 'foo' as foo, 
       r.text REGEXP 'bar' as bar,
       r.text REGEXP 'choo' as choo,
       (foo + bar + choo) as number_found 
FROM results AS r
WHERE r.text REGEXP 'foo|bar|choo'
AND r.text NOT REGEXP 'man'

但是,这不会返回给定模式的匹配,仅返回模式匹配数。

于 2013-07-02T14:53:04.503 回答