【问题标题】:Getting most relevant results when searching from multiple tables (php, mysql)从多个表(php、mysql)中搜索时获得最相关的结果
【发布时间】:2014-03-13 07:01:45
【问题描述】:

我目前正在从 3 个表中搜索(整理后将搜索更多)。此查询按查询中列出的表的顺序显示所有结果。而我想首先获得最相关的搜索结果。

(Select name, url, text, 'behandlinger_scat' AS `table` from  behandlinger_scat where name LIKE '%KEYWORD%' OR text LIKE '%KEYWORD%')
UNION
(Select name, url, text, 'hudsykdommer_scat' AS `table` from  hudsykdommer_scat where name LIKE '%KEYWORD%' OR text LIKE '%KEYWORD%')
UNION
(Select name, url, text, 'om_oss' AS `table` from  om_oss where name LIKE '%KEYWORD%' OR text LIKE '%KEYWORD%')

任何帮助将不胜感激。

【问题讨论】:

  • 您需要弄清楚是什么让结果更相关并分配分数,然后按相关性排序
  • Order SQL by strongest LIKE? 的可能重复项
  • @loopo 谢谢,但你能详细解释一下吗?

标签: php mysql search


【解决方案1】:

您可以使用一种方法按照动态给出结果的点进行排序,如本例所示(您需要为表设置别名,以便 SQL 了解您所指的列):

            ORDER BY 
            CASE WHEN name LIKE table.keywords THEN 100 ELSE 0 END +
            CASE WHEN name  LIKE table2.keywords THEN 10 ELSE 0 END +
            CASE WHEN text  LIKE table2.keyword THEN 1 ELSE 0 END
            DESC

这只是一个例子,但概念如下:
您决定每个“匹配”将获得多少“点”(例如,名称匹配关键字是 100 点,文本匹配它 - 少一点)然后,每行“累积”与其匹配相关的点,以及最多的行点先显示。

【讨论】:

  • 谢谢让我试试这个。
  • 好的!不要忘记两件重要的事情:1.最后的“DESC”(按最相关到最不相关的顺序)2.为每个表提供不同的别名(将您现在拥有的“as table”更改为“as table1,2,3"。好吗?
  • 但实际上我不能为表提供不同的别名,因为我正在检查表名并根据表名构建 URL。代码是:`$anc = 'example.no'; if($table=='behandlinger_scat') $anc .= 'behandlinger'; elseif($table=='hudsykdommer_scat') $anc .= 'hudsykdommer'; elseif($table=='om_oss') $anc .= 'omoss'; `
  • 我正在用一个例子为你更新我的答案
  • @OMI 查看完整示例。根据您的需要进行更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-30
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-09
相关资源
最近更新 更多