【问题标题】:Order SQL results by number of LIKE matches from multiple columns按来自多列的 LIKE 匹配数对 SQL 结果进行排序
【发布时间】:2019-08-28 19:40:38
【问题描述】:
SELECT id 
FROM table 
WHERE fistname LIKE CONCAT('%',?,'%') 
   OR secondname LIKE CONCAT('%',?,'%') 
   OR middlename LIKE CONCAT('%',?,'%')");

$stmt->bind_param("sss", $first, $second, $middle);

我希望能够对返回的结果进行排序,以便它们按照匹配总数的顺序出现。

例如:

  id | firstname |  secondname   |  middlename    
------------------------------------------------    
  1  |  Thomas   | Smith       |   John    
  2  |  Bob      | Smith       |   John

对于 vars $first = "Thomas", $second = "Smith", $middle="John",结果将按 1,2 的顺序排序

对于 vars $first = "Bob", $second = "Smith", $middle="Peter",结果将按 2,1 的顺序排序

等等……

谢谢!

【问题讨论】:

  • 创建一个FULLTEXT 索引并改用Boolean Full-Text Searches 会更有意义,因为您可以使用SELECT ... ORDER BY AGAINST ('...' IN BOOLEAN MODE) 来获得相关性排序,因为LIKE CONCAT('%',?,'%') 永远无法优化。

标签: php mysql sql-order-by sql-like


【解决方案1】:
ORDER BY
       CASE WHEN firstname  LIKE CONCAT('%',?,'%') THEN 1 ELSE 0 END +
       CASE WHEN secondname LIKE CONCAT('%',?,'%') THEN 1 ELSE 0 END +
       CASE WHEN middlename LIKE CONCAT('%',?,'%') THEN 1 ELSE 0 END DESC

【讨论】:

    【解决方案2】:

    在 Mysql 中,像 name like '%bob%' 这样的布尔表达式被评估为 1(true) 或 0(false),因此您可以添加所有 like 表达式:

    order by
      (fistname like concat('%', ?, '%')) +
      (secondname like concat('%', ?, '%')) +
      (middlename like concat('%', ?, '%')) desc
    

    但由于不想重复WHERE子句和ORDER BY中的参数,可以这样写:

    SELECT t.* FROM (
      SELECT *,
        (fistname LIKE CONCAT('%', ?, '%')) +
        (secondname LIKE CONCAT('%', ?, '%')) +
        (middlename LIKE CONCAT('%', ?, '%')) as matches 
      FROM table
    ) as t 
    WHERE t.matches > 0
    ORDER BY t.matches DESC 
    

    【讨论】:

      猜你喜欢
      • 2014-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 1970-01-01
      相关资源
      最近更新 更多