我有一张这样的表:
-- 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
子句,因此没有定义优先级。你知道,我所要做的就是实现类似这个搜索引擎的东西:
无论如何,有人如何实现查询的优先级?例如,如果您搜索Koop
,则结果的第一行应该是表格中的第二行,因为last_name
列应该具有更高的优先级(而不是first_name
列)和koop
是表格第二行last_name
的确切值。
以下是:input = 'koop'
的预期结果:
+----+------------+-------------+
| 2 | Martin | Koop |
| 1 | John | Kooper |
| 3 | Koop | Sth |
+----+------------+-------------+
我该怎么做?
答案 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) ;