Mysql - 按相关性排序查询,无需全文方法

时间:2015-02-06 17:33:12

标签: php mysql search sql-like

我想知道如何实现这一目标。 我需要通过相关性来命令查询,但我不能这样做,我不想使用全文+布尔模式等因为我有很多记录不是这样出现的(50%以上的regs)和所以我在循环中创建一个查询来逐字搜索,在进行查询之前我自己排除了不相关的单词,两个单词查询过程的结果是这样的:

SELECT UsrNames, UsrLastNames 
FROM user
WHERE 1 AND (UsrNames LIKE '%FirstWord%'
            OR UsrLastNames LIKE '%FirstWord%'
            OR UsrCI LIKE '%FirstWord%'
            OR UsrEmail LIKE '%FirstWord%'
            OR UsrRUC LIKE '%FirstWord%'
            OR UsrCod LIKE '%FirstWord%'
            OR UsrPhone LIKE '%FirstWord%'
            OR UsrNames LIKE '%SecondWord%'
            OR UsrLastNames LIKE '%SecondWord%'
            OR UsrCI LIKE '%SecondWord%'
            OR UsrEmail LIKE '%SecondWord%'
            OR UsrRUC LIKE '%SecondWord%'
            OR UsrCod LIKE '%SecondWord%'
            OR UsrPhone LIKE '%SecondWord%') ORDER BY  UsrNames ASC 
 LIMIT 20
 OFFSET 0

现在正处于开发阶段,所以你不关心开头的“WHERE 1”。

希望这个伟大的社区可以提供帮助。

1 个答案:

答案 0 :(得分:0)

这将按匹配数量排序:

ORDER BY IF(UsrNames LIKE '%FirstWord%', 1, 0)
        + IF(UsrLastNames LIKE '%FirstWord%', 1, 0)
        + IF(UsrCI LIKE '%FirstWord%', 1, 0)
        + IF(UsrEmail LIKE '%FirstWord%', 1, 0)
        + IF(UsrRUC LIKE '%FirstWord%', 1, 0)
        + IF(UsrCod LIKE '%FirstWord%', 1, 0)
        + IF(UsrPhone LIKE '%FirstWord%', 1, 0)
        + IF(UsrNames LIKE '%SecondWord%', 1, 0)
        + IF(UsrLastNames LIKE '%SecondWord%', 1, 0)
        + IF(UsrCI LIKE '%SecondWord%', 1, 0)
        + IF(UsrEmail LIKE '%SecondWord%', 1, 0)
        + IF(UsrRUC LIKE '%SecondWord%', 1, 0)
        + IF(UsrCod LIKE '%SecondWord%', 1, 0)
        + IF(UsrPhone LIKE '%SecondWord%', 1, 0) DESC,
    UsrNames ASC

FIDDLE

IF()表达式将每个比较转换为数字并将它们合计。如果您愿意,您甚至可以通过为某些字段提供比1更高的值来使某些字段在排名中更重要。