关于mysql:按特定字段的相似度/相关度对查询结果进行排序

Sorting query results by similarity/relevance of specific field

这是我的表,存储 2 个足球队名称(主客)的方式基本不同

1
2
3
-----------------------------------------------------------------------------
|host|host_aio|h_unchar|h_a|h_b|guest|guest_aio|guest_unchar|guest_a|guest_b|
-----------------------------------------------------------------------------

我有一个主人和一个客人的名字,我会用不同的方式将它们分解,以找到与搜索团队相对应的行

例如在 Melbourne Victory VS Brisbane Roar 的情况下
我的查询是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
SELECT `host`,`guest`,`h_aio`,`g_aio`,`h_unchar`,`g_unchar`,`h_a`,`h_b`,`g_a`,`g_b`
FROM `tbl` WHERE (

host  IN ('melbourne victory','melbournevictory','melbourne','victory')||
h_aio IN ('melbourne victory','melbournevictory','melbourne','victory')||
h_unchar IN ('melbourne victory','melbournevictory','melbourne','victory') ||
h_a IN ('melbourne victory','melbournevictory','melbourne','victory') ||
h_b IN ('melbourne victory','melbournevictory','melbourne','victory') ||
h_c IN ('melbourne victory','melbournevictory','melbourne','victory') ||
h_d IN ('melbourne victory','melbournevictory','melbourne','victory') ||
h_g IN ('melbourne victory','melbournevictory','melbourne','victory') )

AND (

guest IN ('brisbane roar','brisbaneroar','brisbane','roar')||
g_aio IN ('brisbane roar','brisbaneroar','brisbane','roar')||
g_unchar IN ('brisbane roar','brisbaneroar','brisbane','roar')||
g_a IN ('brisbane roar','brisbaneroar','brisbane','roar') ||
g_a IN ('brisbane roar','brisbaneroar','brisbane','roar') ||
g_b IN ('brisbane roar','brisbaneroar','brisbane','roar') ||
g_c IN ('brisbane roar','brisbaneroar','brisbane','roar') ||
g_d IN ('brisbane roar','brisbaneroar','brisbane','roar') ||
g_g IN ('brisbane roar','brisbaneroar','brisbane','roar') )

ORDER BY FIELD(`h_unchar`, 'melbournevictory'), FIELD(`g_unchar`, 'brisbaneroar')

结果如下:

enter

1
ORDER BY FIELD(`h_unchar`, 'melbournevictory'), FIELD(`g_unchar`, 'brisbaneroar')

但正如您在图片中看到的,21 岁以下的匹配 (U21) 位于顶部
我怎样才能在顶部获得更相似的行?

这里有更多信息:

基本上我从 2 个不同的 API 获得球队名称,第一个 API 名称与第二个 API 名称略有不同,例如(巴塞罗那和巴塞罗那)

并且每个 api 都有一个唯一的信息,其他 api 不会发送...所以我需要以某种方式连接这 2 个 api 并从两者中获取每个游戏的所有信息..我将第一个存储在数据库中,当第二个一个发送我在数据库中搜索的信息以使用团队名称查找第一个 api 信息(api 1 在比赛前发送数据,abpi 2 在比赛后发送数据)


由于您正在搜索特定的比赛/比赛,并且每天没有很多比赛具有相同的主机/客人名称,我建议您在代码方面执行此操作并避免使已经潜在的缓慢查询复杂化


这不是一个简单的问题,但是如果您想要一些基本的东西,像这种方法可能会有所帮助;
如何使用 PHP 对 MYSQL 中的公司名称进行模糊匹配以实现自动完成?

事实上,这是一个机器学习问题,您需要构建类似聚类算法并找到条目之间的距离,或者构建人们正在寻找的预测算法;这不是一个简单的查询问题。