3

我有一个与此问题类似的查询

MySQL - 如何按相关性排序?INNODB 表

不同的是,这里我想从 5 个字段中搜索为

add1, add2, add3, post_town, post_code

并且只有post_code字段中的记录不会为空,其他字段记录在某些地方可能为空。如果我搜索关键字kingston,它会返回

Acre Road, Kingston upon Thames, KT2 6EA

Kingston Road, Epsom, KT19 0DG

Kingston Road, Epsom, KT20 0DH

这些结果是所有字段add1、add2、add3、post_town、post_code 的组合

我需要这个结果按以下顺序

Kingston Road, Epsom, KT19 0DG

Kingston Road, Epsom, KT20 0DH

Acre Road, Kingston upon Thames, KT2 6EA

我当前的 SQL 查询是这样的

SELECT add1, add2, add3, post_town, post_code FROM address_mst 
WHERE add1 LIKE '%".$keyword."%'
OR add2 LIKE '%".$keyword."%'
OR add3 LIKE '%".$keyword."%'
OR post_town LIKE '%".$keyword."%'
OR post_code LIKE '%".$keyword."%'

所以我需要以搜索关键字开头的记录将首先出现。我怎样才能做到这一点 ?

4

3 回答 3

5

不是最漂亮的,但应该工作!

select a.* from (
SELECT add1, add2, add3, post_town, post_code, 1 as rank FROM address_mst 
WHERE add1 LIKE '%".$keyword."%'
UNION
SELECT add1, add2, add3, post_town, post_code, 2 as rank FROM address_mst 
WHERE add2 LIKE '%".$keyword."%'
UNION
SELECT add1, add2, add3, post_town, post_code, 3 as rank FROM address_mst 
WHERE add3 LIKE '%".$keyword."%'
UNION
SELECT add1, add2, add3, post_town, post_code, 4 as rank FROM address_mst 
WHERE post_town LIKE '%".$keyword."%'
UNION
SELECT add1, add2, add3, post_town, post_code, 5 as rank FROM address_mst 
WHERE post_code LIKE '%".$keyword."%'
) a
order by a.rank asc;
于 2011-09-28T11:55:05.850 回答
1

为什么不使用查询选择最小的合格结果,并在脚本中使用自己的逻辑来为您的结果提供预先排名权重并相应地对它们进行排序?

这将帮助您:

  1. 有更复杂的排名标准,这在查询中可能也可能不可能。

  2. 如果您的排名标准发生变化,则不要编辑 sql 查询。

于 2011-09-28T11:59:36.830 回答
1

对于基于相关性的排序,全文搜索是更可靠的选择。

FULL TEXT SEARCH根据搜索词的出现次数使用相关性,这些词可以稍后用于 ORDER 返回的结果。

于 2011-09-28T13:14:14.283 回答