【问题标题】:Sorting query results by similarity/relevance of specific field按特定字段的相似性/相关性对查询结果进行排序
【发布时间】:2016-04-21 11:06:39
【问题描述】:

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

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

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

例如Melbourne Victory VS Brisbane Roar 我的查询是:

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')

结果如下:

我想通过h_unchar 和g_unchar 与host 和guest 的相关性/相似性对结果进行排序,这就是我添加的原因。

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 在比赛后发送数据)

【问题讨论】:

  • @RyanVincent 基本上我从 2 个不同的 API 获取团队名称,前 1 个名称与第二个名称略有不同(fc barcelona 和 Barcelona),每个 api 都有一个独特的信息,其他 api不会发送...所以我需要以某种方式连接这2个api并从两者中获取每个游戏的所有信息..我将第一个存储在数据库中,当第二个发送信息时我在数据库中搜索以找到第一个api使用团队名称的信息
  • @RyanVincent 实际上这是规范化表,该表仅包含主机和来宾名称的不同变体,其他数据存储在不同的表中......我无法再规范化该表,因为我需要在单个查询中检查主机和来宾名称,以避免其他团队使用相似名称

标签: mysql


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这不是一个简单的问题,但如果您想要一些基本的东西,像这种方法可能会有所帮助; How do I do a fuzzy match of company names in MYSQL with PHP for auto-complete?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-28
      • 1970-01-01
      • 2011-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多