如何搜索两列并按优先级对结果进行排序?

时间:2017-08-04 09:01:06

标签: mysql sql search-engine

我有一张这样的表:

-- users
+----+------------+-------------+
| id | first_name |  last_name  |
+----+------------+-------------+
| 1  | John       | Kooper      |
| 2  | Martin     | Koop        |
| 3  | Koop       | Sth         |
| 4  | Jack       | Linoff      |
+----+------------+-------------+

这是一个包含我网站用户的表格。现在我想搜索它们。您的查询建议是什么?

这是我当前的查询:

SELECT u.*
FROM users 
WHERE first_name LIKE :input%
   OR last_name LIKE :input%
   OR CONCAT(first_name, last_name) LIKE :input%

正如您所看到的,我的查询只是搜索,没有别的。没有任何ORDER BY子句,因此没有定义优先级。你知道,我所要做的就是实现类似这个搜索引擎的东西:

enter image description here

无论如何,有人如何实现查询的优先级?例如,如果您搜索Koop,则结果的第一行应该是表格中的第二行,因为last_name列应该具有更高的优先级(而不是first_name列)koop是表格第二行last_name的确切值。

以下是:input = 'koop'的预期结果:

+----+------------+-------------+
| 2  | Martin     | Koop        |
| 1  | John       | Kooper      |
| 3  | Koop       | Sth         |
+----+------------+-------------+

我该怎么做?

3 个答案:

答案 0 :(得分:1)

考虑使用FULLTEXT搜索。

SELECT *,
    MATCH (`first_name`) AGAINST (':input*' IN BOOLEAN MODE) AS `relevance_first_name`,
    MATCH (`last_name`) AGAINST (':input*' IN BOOLEAN MODE) AS `relevance_last_name`
FROM `users`
WHERE MATCH (`first_name`, `last_name`) AGAINST (':input*' IN BOOLEAN MODE)
ORDER BY (`relevance_first_name`)+(`relevance_last_name`*4) DESC

答案 1 :(得分:0)

您可以使用ORDER BY列... 例如,您可以按姓氏排序,然后按名字排序。

SELECT u.* FROM users 
    WHERE first_name LIKE :input%
        OR last_name LIKR :input%
        OR CONCAT(first_name, last_name) LIKE :input%
    ORDER BY last_name, first_name;

<强>更新 根据您的评论,如果您想按优先级排序,即评级或其他任何内容,您应该使用ORDER BY users._column_name或加入其他评级列所在的表格,并按此列对结果进行排序。

答案 2 :(得分:0)

一个简单的解决方案可能是order by子句中的(switch)case语句,如下所示:

SELECT u.*
FROM users 
WHERE first_name LIKE :input%
OR last_name LIKE :input%
OR CONCAT(first_name, last_name) LIKE :input%     
ORDER BY 
(CASE WHEN first_name = :input THEN 1 
      WHEN first_name LIKE :input% THEN 2 (....) ELSE 99 END) ;