按动态数组中最独特的出现次数的顺序拉取记录


Pull records in order of most unique occurrences of dynamic array?

我正试图根据我网站上用户定义的关键词列表提取最相关的工作。因此,作为用户,如果我指定以下关键字:

builder
bricks
concrete

我想知道如何在数据库中搜索至少有一个单词的所有作业,但按包含这三个单词的作业排序。

我的数据库表如下-

job_id             INT
job_title          VARCHAR
job_description    TEXT

所以我想检查jobdescription字段,如果它找到了所有3个关键字,它会在顶部排序,然后是3个关键字中有2个在jobdescription中的作业,然后是1。

可怕的黑客攻击,但通过对源数组的一些客户端处理,您可以动态构建一个查询,看起来像:

SELECT 
   LOCATE('red', your_text_field) +
   LOCATE('green', your_text_field) +
   etc...
   LOCATE('purple', your_text_field) AS color_count
FROM ...
ORDER BY color_count DESC

如果不存在特定的颜色,LOCATE将返回0,并且不会对总和产生影响。

我会对问题的第一部分进行全文搜索,而对唯一出现次数进行排名的第二部分则有点困难。

示例:

SELECT SQL_CALC_FOUND_ROWS 
     something_tbl.*,
     MATCH(something_tbl.field_1, something_tbl.field_2)
         AGAINST (:keywords) AS score
FROM something_tbl
WHERE MATCH(something_tbl.field_1, something_tbl.field_2)
         AGAINST (:keywords IN BOOLEAN MODE)
ORDER BY score DESC

如果不提供更多关于表结构的详细信息,这只能是徒劳的回答。

但是,如果数据基于类似字符串的数据类型,请考虑使用全文索引。

基本示例。your_field在全文索引中。

+----+-------------------------------------------------------------+
| id | your_field                                                  |
+----+-------------------------------------------------------------+
|  1 | red                                                         |
|  2 | green red                                                   |
|  3 | black red                                                   |
|  4 | yellow red green blue orange                                |
|  5 | black blue                                                  |
+----+-------------------------------------------------------------+

现在的SQL:

SELECT *, 
    MATCH (your_field) 
        AGAINST ('+yellow +red +green +blue +orange' IN BOOLEAN MODE) AS 'val'
FROM yourtable 
WHERE MATCH (your_field)
    AGAINST ('+yellow +red +green +blue +orange' IN BOOLEAN MODE)
ORDER BY val DESC;

更多信息可以在手册中找到。