按照动态数组最独特的顺序拉动记录?

时间:2013-08-16 18:56:41

标签: php mysql

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

builder
bricks
concrete

我想弄清楚如何搜索数据库中至少包含其中一个的所有作业,但是按包含所有这三个单词的作业排序。

我的数据库表如下 -

job_id             INT
job_title          VARCHAR
job_description    TEXT

所以我想查看job_description字段,如果它找到所有这3个关键字,它会在顶部订购,那么3个中有2个在job_description中的那些作业然后是1。

3 个答案:

答案 0 :(得分: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并且不会对总和做出贡献。

答案 1 :(得分: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

答案 2 :(得分:0)

如果没有提供有关表结构外观的更多详细信息,这只是值得回答的问题。

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

基本示例。 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;

可以找到更多信息here in the manual