Php MySQL搜索与相邻记录之间的单词距离

Php MySQL搜索与相邻记录之间的单词距离,php,mysql,distance,levenshtein-distance,Php,Mysql,Distance,Levenshtein Distance,我正在MySQL数据库中对静态记录执行关键字文本搜索。是否可以构造一个查询,在记录中查找第一个关键字,在相邻记录中查找第二个关键字?考虑下面的样本数据。 ------------------------------------------------------ | id | textstrings | ------------------------------------------------------ | 1 | E

我正在MySQL数据库中对静态记录执行关键字文本搜索。是否可以构造一个查询,在记录中查找第一个关键字,在相邻记录中查找第二个关键字?考虑下面的样本数据。

------------------------------------------------------
| id | textstrings                                   |
------------------------------------------------------
|  1 | Every good boy does fine.                     |
|  2 | The quick brown fox jumped over the lazy dog. |
|  3 | I will not eat green eggs and ham.            |
|  4 | There is no time like the present.            |
|  5 | Envy is an ugly shade of green.               |
------------------------------------------------------
搜索术语
green-brown
应返回记录2和3,因为它们是相邻记录,但不应包含记录5,因为它不是记录3的相邻记录

我知道我可以对这两个词中的任何一个执行查询,并通过处理结果集来实现这一点,但我想知道是否有可能将其构建到查询中


此字段确实有全文索引。

您可以将两个查询合并在一起,一个查询将搜索包含第一个搜索字符串的ID(
green
,在本例中),另一个查询将搜索包含第二个搜索字符串的ID(
brown

SELECT
语句的结构是删除重复的相邻
id
对,这可能是由于
WHERE
子句造成的

SELECT LEAST(t1.id, t2.id) AS id1, GREATEST(t1.id, t2.id) AS id2
FROM
(
    SELECT id
    FROM table
    WHERE textstrings LIKE '%green%'
) t1
INNER JOIN
(
    SELECT id
    FROM table
    WHERE textstrings LIKE '%brown%'
) t2
ON t1.id = t2.id - 1 OR t1.id = t2.id + 1
GROUP BY LEAST(t1.id, t2.id), GREATEST(t1.id, t2.id)
单击下面的链接,查看正在运行的演示


那太优雅了!可以增加距离吗?如中所示,间隔不超过2个记录。我不需要它,现在我只是好奇。如果你想让记录分开2个(而且只分开2个),你可以把
WHERE
子句改为:
t1.id=t2.id-2或t1.id=t2.id+2
,我想我现在已经绞尽脑汁了。很不错的。谢谢你的帮助!对于其他感兴趣的人,您可以通过调整比较来限制一定的距离。对于间隔不超过3的记录(包括),可以在t1.id>=t2.id-3和t1.id上使用