我在这个问题上提出了类似的查询
MySQL - How to ORDER BY RELEVANCE? INNODB Table
不同之处在于,我想从5个字段中搜索
add1,add2,add3,post_town,post_code
只有 post_code 字段中的记录才会为空,其他字段记录在某些地方可能为空。如果我搜索关键字金士顿,则返回
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查询就像这样
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."%'
所以我需要带有搜索记录的关键字一开始就会出现。我怎么能这样做?
答案 0 :(得分: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;
答案 1 :(得分:1)
为什么不用查询选择最小的合格结果,并在脚本中使用自己的逻辑来为结果提供预先的排名权重并对其进行相应的排序?
这会帮助你:
在查询中包含更复杂的排名标准。
如果您的排名标准发生变化,则不会编辑SQL查询。
答案 2 :(得分:1)
对于基于相关性的排序,FULL TEXT SEARCH是更可靠的选项。
FULL TEXT SEARCH
根据搜索词的出现次数使用了相关性,以后可以将其用于ORDER返回的结果。