我有一个关于这个问题的类似查询
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
My Current SQL query is like this
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."%'
所以我需要记录与搜索关键字在开始将首先出现。
不是最漂亮的,但应该可以工作!
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;
对于基于相关性的排序,全文搜索是更可靠的选择。
FULL TEXT SEARCH
根据搜索词的出现次数使用相关性,可用于对返回的结果进行排序。
为什么不使用query选择最小的符合条件的结果,并在脚本中使用自己的逻辑为结果提供提前排名权重并相应地对它们进行排序呢?
这将有助于你:
-
具有更复杂的排序标准,这些标准在查询中可能是可能的,也可能是不可能的。
-
如果你的排名标准改变了,不编辑sql查询